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

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的要求。

相关推荐
X journey6 小时前
机器学习进阶(13):支持向量机SVM
算法·机器学习·支持向量机
洛水水6 小时前
【力扣100题】30.二叉树的直径
算法·leetcode·职场和发展
gihigo19987 小时前
Bezier曲线曲面生成算法
算法
平行侠7 小时前
024多精度大整数 - 突破硬件精度限制的任意精度运算
数据结构·算法
IronMurphy8 小时前
【算法四十五】139. 单词拆分
算法
洛水水9 小时前
【力扣100题】32.将有序数组转换为二叉搜索树
数据结构·算法·leetcode
如竟没有火炬9 小时前
用队列实现栈
开发语言·数据结构·python·算法·leetcode·深度优先
云栖梦泽在10 小时前
AI安全入门:AI模型泄露的风险与防护措施
人工智能·算法·动态规划
水木流年追梦10 小时前
大模型入门-应用篇3-Agent智能体
开发语言·python·算法·leetcode·正则表达式
洛水水10 小时前
【力扣100题】31.二叉树的层序遍历
算法·leetcode·职场和发展