力扣题解(统计逆序对的数目)

3193. 统计逆序对的数目

已解答

困难

相关标签

相关企业

提示

给你一个整数 n 和一个二维数组 requirements ,其中 requirements[i] = [endi, cnti] 表示这个要求中的末尾下标和 逆序对 的数目。

整数数组 nums 中一个下标对 (i, j) 如果满足以下条件,那么它们被称为一个 逆序对

  • i < jnums[i] > nums[j]

请你返回 [0, 1, 2, ..., n - 1]

排列

perm 的数目,满足对 所有requirements[i] 都有 perm[0..endi] 恰好有 cnti 个逆序对。

由于答案可能会很大,将它对 109 + 7 取余 后返回。

思路:

对于数字排序问题,常见的思路是利用深度遍历搜索(dfs),遍历所有可能的情况,然后返回符合条件的数目。本题思路也是如此,难点在于如何描述符合的情况。如果直接利用实际的数字进行排序,时间复杂度是O(N!),一定会超时的,所有有抽象的描述符合条件的方法。

由于求(endi,cnti)的逆序对的个数,只会和0---endi有关,所以可以利用前endi-1个数进行描述。可知,当前endi-1个数提供了k个数的时候,最后一个数如果可以提供cnti-k个数,那就是符合条件的。然后再展开详细分析:如果0--endi-1个数,在requirement数组中出现过,那么0--endi-1个数所提供的逆序对的个数就是确定的k个,那么endi所提供的逆序对的个数也是固定的endi-k个,而且该位置所能取得的数字只有一个(因为最后一个位置的逆序对确定了,所以该位置的数只能是比前面的数中的前endi-k个大的数,是一个固定的数),而能提供endi-k个的数字,要满足 endi-k>=0 &&endi-k<=n,即如果endi-k符合这个条件,就是存在的,返回的个数就是前endi-1个数有k个逆序对的时候的个数。

如果0--endi-1个数,没有在requirement数组中出现过,分析0--endi-1个数字要提供的逆序对的个数,最多是cnt个,最少是max(cnt-endi,0)个,此处之所以这么表示,是endi最多只能提供endi个逆序对,则0--endi-1最少提供cnt-endi个,又提供数目不能小于0,所以是两者中的最大值。

因此,只需要依次求(endi-1,cnt1)返回的结果的和就是所要求的结果,其中cnt1要满足在 max(cnt-endi,0)到cnt之间。

最后返回的结果(n-1,requirement[][]),其中requirement是对于end是n-1的要求。

相关推荐
永远都不秃头的程序员(互关)20 小时前
【K-Means深度探索(一)】数据炼金术第一步:从零手撕K-Means聚类算法
算法·kmeans·聚类
我想回家种地20 小时前
算法期末复习
算法
rgeshfgreh20 小时前
MPPI算法实战:运动规划新利器
算法
Xの哲學20 小时前
Linux epoll 深度剖析: 从设计哲学到底层实现
linux·服务器·网络·算法·边缘计算
小猪咪piggy20 小时前
【leetcode100】回溯
数据结构·算法
m0_6038887120 小时前
More Images, More Problems A Controlled Analysis of VLM Failure Modes
人工智能·算法·机器学习·ai·论文速览
恶魔泡泡糖20 小时前
51单片机矩阵按键
c语言·算法·矩阵·51单片机
叶子20242220 小时前
电力系统分析---对称分量法
算法
千金裘换酒21 小时前
LeetCode 二叉树的最大深度 递归+层序遍历
算法·leetcode·职场和发展
爱敲代码的TOM21 小时前
详解一致性哈希算法
算法·哈希算法