Leetcode 3193. Count the Number of Inversions

  • [Leetcode 3193. Count the Number of Inversions](#Leetcode 3193. Count the Number of Inversions)
    • [1. 解题思路](#1. 解题思路)
    • [2. 代码实现](#2. 代码实现)

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 n−p放置到最后一个元素,然后将所有原序列当中所有大于等于 n − p n-p n−p的元素加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,k−n)∑kf(n,i)

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

2. 代码实现

给出python代码实现如下:

python 复制代码
MOD = 10**9+7

class 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 0
            elif cnt > idx * (idx+1) // 2 or cnt < 0:
                return 0
            elif idx in rq and cnt != rq[idx]:
                return 0
            elif idx-1 in rq:
                return dp(idx-1, rq[idx-1]) if cnt-idx <= rq[idx-1] <= cnt else 0
            ans = 0
            for pre_cnt in range(cnt-idx, cnt+1):
                ans += dp(idx-1, pre_cnt)
            return ans % MOD
        
        ed, cnt = requirements[-1]
        ans = dp(ed, cnt)
        return ans

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

相关推荐
觅特科技-互站41 分钟前
陌讯视觉‘动态密度流’模型:亚运场馆到前海政务厅,98.6%聚众事件5秒精准定位|技术拆解+SDK实录
逻辑回归·动态规划
_不会dp不改名_2 小时前
leetcode_3010 将数组分成最小总代价的子数组 I
算法·leetcode·职场和发展
沉睡的无敌雄狮3 小时前
生态即壁垒:陌讯视觉‘开箱即战’背后的OSI七层协同架构
逻辑回归·动态规划
Tisfy7 小时前
LeetCode 3637.三段式数组 I:一次遍历(三种实现)
算法·leetcode·题解·模拟·数组·遍历·moines
期末考复习中,蓝桥杯都没时间学了8 小时前
力扣刷题15
算法·leetcode·职场和发展
im_AMBER9 小时前
Leetcode 111 两数相加
javascript·笔记·学习·算法·leetcode
TracyCoder1239 小时前
LeetCode Hot100(21/100)——234. 回文链表
算法·leetcode·链表
@––––––9 小时前
力扣hot100—系列1
算法·leetcode·职场和发展
老鼠只爱大米9 小时前
LeetCode经典算法面试题 #236:二叉树的最近公共祖先(RMQ转化、Tarjan离线算法等五种实现方案详细解析)
算法·leetcode·二叉树·lca·并查集·最近公共祖先·rmq
问好眼9 小时前
【信息学奥赛一本通】1296:开餐馆
c++·算法·动态规划·信息学奥赛