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

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

相关推荐
复杂网络2 小时前
AI 不睡觉,但它比你更会做实验
算法
贵慜_Derek2 小时前
MAI-04|干净数据在工程上意味着什么:MAI 预训练数据治理
人工智能·算法·llm
vibecoding日记20 小时前
双非如何快速入职字节等大厂大模型?真实案例分析:推理优化和投机解码
算法·求职·大模型工程师
yszaygr21381 天前
Verilog参数化游程编码RLE模块
算法
望易1 天前
刚设计的大模型架构-双域耦合认知框架
算法·架构
复杂网络1 天前
多个 Claude Code 与多个 Codex 协同工作:设计与实现方案
算法
HjhIron2 天前
面试常客:字符串算法从入门到进阶
算法·面试
吴佳浩2 天前
DeepSeek DSpark:Confidence-Scheduled Speculative Decoding 技术解析
人工智能·算法·deepseek