
归并排序
algsup
这个作者很懒,什么都没留下…
展开
-
[归并排序]leetcode493:翻转对(hard)
题目:题解:思路:利用归并排序的思想,对两个升序子序列进行统计翻转对的个数。1)对于a[l…mid,mid+1…r]中的左右两段 a[l…mid] 和 a[mid+1…r],我们利用指针 i 来遍历左半序列,利用指针 j 来遍历右半序列,由于 a[i] 具有单调性,之前的 a[i] > 2*a[j],我们只有将指针 j 不断右移才能寻找大于 a[i+1]的,满足 j 不断右移的条件。代码如下:const int N = 50010;int b[N];class Soluti原创 2022-02-02 19:14:52 · 569 阅读 · 0 评论 -
[归并排序]leetcode327:区间和的个数(hard)
题目:题解:思路:归并排序1)对于区间和的快速求解需要使用前缀和,由于 a 中的元素有正有负,所以前缀和数组不是单调递增的,我们可以对前缀和数组进行归并排序,顺便计算区间和的个数,求 pre[j]-pre[i]∈[lower,upper] 的 (i,j) 的个数。2)思考如何利用两个升序数组n1,n2求出n2[j]-n1[i]∈[lower,upper]?3)在解决这一问题后,原问题就迎刃而解了:我们采用归并排序的方式,能够得到左右两个数组排序后的形式,以及对应的下标对数量。对于原数组而原创 2022-02-02 17:03:11 · 803 阅读 · 0 评论 -
[归并排序]剑指 Offer 51. 数组中的逆序对(hard)
题目:题解:思路:归并排序的模板题,在递归处理两个升序子序列时,a[l…r] 中的左序列 a[l…mid] 和右序列 a[mid+1,r] 利用两个指针 i 和 j 在合并时,顺便进行统计逆序对个数。若 a[i]>a[j],由于 a[l…r] 是升序的,那么 a[i…mid]之间的所有元素都会大于 a[j],统计此时的个数为 mid-i+1 即可。代码如下:const int N = 5e5+10;int b[N];class Solution {public: int原创 2022-02-02 16:42:20 · 142 阅读 · 0 评论