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

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

相关推荐
手握风云-17 分钟前
优选算法的妙思之流:分治——快排专题
数据结构·算法
熬夜苦读学习25 分钟前
Linux进程信号
linux·c++·算法
白白糖28 分钟前
二叉树 递归
python·算法·力扣
jyyyx的算法博客39 分钟前
Leetcode 857 -- 贪心 | 数学
算法·leetcode·贪心·嗜血
ChoSeitaku1 小时前
NO.64十六届蓝桥杯备战|基础算法-简单贪心|货仓选址|最大子段和|纪念品分组|排座椅|矩阵消除(C++)
算法·矩阵·蓝桥杯
l1n3x1 小时前
编译原理前端-词法分析
算法·编译原理
一只天蝎的晋升之路1 小时前
基础算法之:动态规划
算法·动态规划
KangkangLoveNLP1 小时前
手动实现一个迷你Llama:使用SentencePiece实现自己的tokenizer
人工智能·深度学习·学习·算法·transformer·llama
独好紫罗兰2 小时前
洛谷题单3-P1420 最长连号-python-流程图重构
开发语言·python·算法
柯ran2 小时前
数据结构|排序算法(一)快速排序
数据结构·算法·排序算法