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

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

相关推荐
adam-liu1 小时前
Fun Audio Chat 论文+项目调研
算法·语音端到端·fun-audio-chat
栀秋6662 小时前
你会先找行还是直接拍平?两种二分策略你Pick哪个?
前端·javascript·算法
如果你想拥有什么先让自己配得上拥有2 小时前
数学思想和数学思维分别都有什么?
线性代数·算法·机器学习
长安er3 小时前
LeetCode136/169/75/31/287 算法技巧题核心笔记
数据结构·算法·leetcode·链表·双指针
MarkHD3 小时前
智能体在车联网中的应用:第29天 多智能体完全合作场景的核心算法:从CTDE思想到VDN与MADDPG的深度解析
算法
wanzhong23333 小时前
CUDA学习5-矩阵乘法(共享内存版)
深度学习·学习·算法·cuda·高性能计算
fufu03114 小时前
Linux环境下的C语言编程(四十八)
数据结构·算法·排序算法
Yingye Zhu(HPXXZYY)4 小时前
Solution to Luogu P6340
算法
小熳芋4 小时前
单词搜索- python-dfs&剪枝
算法·深度优先·剪枝
Xの哲學4 小时前
Linux SLAB分配器深度解剖
linux·服务器·网络·算法·边缘计算