欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > Leetcode 3193. Count the Number of Inversions

Leetcode 3193. Count the Number of Inversions

2025/5/10 20:12:32 来源:https://blog.csdn.net/codename_cys/article/details/139905843  浏览:    关键词:Leetcode 3193. Count the Number of Inversions
  • Leetcode 3193. Count the Number of Inversions
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3193. Count the Number of Inversions

1. 解题思路

这一题的话我的思路核心还是动态规划,因此核心就是迭代关系如何构建。

我们定义 f ( n , k ) f(n, k) f(n,k)表示将1到 n n n一共n个元素进行排列,一共有 k k k个逆序pair的排列数目。我们考察 f ( n + 1 , k ) f(n+1, k) f(n+1,k)的构造方式。

一种直接的构造就是基于 f ( n , k ) f(n,k) f(n,k),我们考虑如何加入元素 n + 1 n+1 n+1即可。如果将 n + 1 n+1 n+1放到最后一个元素,则必然有 k k k个序列pair,如果要有 k + p k+p k+p个逆序pair,那么我们基于 f ( n , k ) f(n,k) f(n,k)当中的任意排列进行改造,只需要将元素 n − p n-p np放置到最后一个元素,然后将所有原序列当中所有大于等于 n − p n-p np的元素加1,就可以保持前 n n n个元素依然保持 k k k个逆序pair,而总的 n + 1 n+1 n+1个元素有 k + p k+p k+p的逆序pair。

综上,我们即可整理得到迭代关系:

f ( n + 1 , k ) = ∑ i = m a x ( 0 , k − n ) k f ( n , i ) f(n+1, k) = \sum\limits_{i = \mathop{max}(0, k-n)}^{k} f(n, i) f(n+1,k)=i=max(0,kn)kf(n,i)

我们将其翻译为代码语言并加入限制条件即可。

2. 代码实现

给出python代码实现如下:

MOD = 10**9+7class Solution:def numberOfPermutations(self, n: int, requirements: List[List[int]]) -> int:requirements = sorted(requirements)rq = {ed: cnt for ed, cnt in requirements}@lru_cache(None)def dp(idx, cnt):if idx == 0:return 1 if cnt == 0 else 0elif cnt > idx * (idx+1) // 2 or cnt < 0:return 0elif idx in rq and cnt != rq[idx]:return 0elif idx-1 in rq:return dp(idx-1, rq[idx-1]) if cnt-idx <= rq[idx-1] <= cnt else 0ans = 0for pre_cnt in range(cnt-idx, cnt+1):ans += dp(idx-1, pre_cnt)return ans % MODed, cnt = requirements[-1]ans = dp(ed, cnt)return ans

提交代码评测得到:耗时8757ms,占用内存116.3MB。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词