class Solution {
public int reversePairs(int[] nums) {
return sort(nums, 0, nums.length - 1);
}
private int sort(int[] a, int l, int r) {
if (l >= r) return 0;
int mid = l + r >> 1;
int sum = sort(a, l, mid) + sort(a, mid + 1, r);
int i = l, j = mid + 1;
int[] tmp = new int[r - l + 1];
int idx = 0;
while (i <= mid && j <= r) {
if (a[i] <= a[j]) tmp[idx++] = a[i++];
else {
sum += (mid + 1 - i);
tmp[idx++] = a[j++];
}
}
while (i <= mid) tmp[idx++] = a[i++];
while (j <= r) tmp[idx++] = a[j++];
idx = 0;
for (int k = l; k <= r; k++, idx++)
a[k] = tmp[idx];
return sum;
}
}
共以下 15 个回答
归并排序的思想,不要忘记递归结束条件
归并排序
思路:归并排序
时间复杂度:O(NlogN)
空间复杂度:O(N)
标注① ②的方法都可以解决问题,此题类似翻转对,和计算右侧小于自身元素相同。于是采用两道题目的思想解答
C++& nums) {
归并排序,不会做,看视频的方法
——————————————————
class Solution {
public:
int reversePairs(vector
if(nums.size() <= 1) return 0;
return mergeSort(nums, 0, nums.size() – 1);
}
};
二路归并法时间复杂度O(nlgn),空间复杂度为O(n)
冒泡排序,力扣没通过,时间复杂度O(n ^ 2),空间复杂度为O(1)
时间:O(nlogn),空间:O(n)
//归并排序& s,vector & a){ & nums) { a(n,0);
class Solution {
public:
int ms(int l,int r,vector
if(l>=r) return 0;
int mid=l+(r-l)/2;
int res=ms(l,mid,s,a)+ms(mid+1,r,s,a);
int i=l,j=mid+1,cnt=l;
while(i<=mid&&j<=r){
if(s[j]<s[i]){
a[cnt++]=s[j++];
res+=mid-i+1;
}
else a[cnt++]=s[i++];
}
while(i<=mid) a[cnt++]=s[i++];
while(j<=r) a[cnt++]=s[j++];
for(int k=l;k<=r;++k) s[k]=a[k];
return res;
}
int reversePairs(vector
int n=nums.size();
if(n0||n1) return 0;
vector
return ms(0,n-1,nums,a);
};