直接暴力,
O
(
N
2
)
O(N^2)
O(N2)时间复杂度,必然是超时的,hard 怎么可能让你这么轻松AC 😏,楼主还是愿意试试:
试了两种方法超时了,还是太笨了,于是不争气的看了题解😩,之前没做过这种题型,可以理解,下次碰到这种可不能错了,这是基于分治法的一种应用,如果熟悉归并排序的,应该是没问题,不熟悉的话,可以跳到这里 归并排序,我们在合并的过程中进行计算,这里官方给了一个视频讲解,(顺便膜拜一下weiwei大佬😊):
《剑指 Offer》 51. 数组中的逆序对
下面给出相应的代码:
class Solution {
public int reversePairs(int[] nums) {
int len = nums.length;
if(len < 2) return 0;
return reversePairs(nums, 0, len-1, new int[len]);
}
private int reversePairs(int[] nums, int left, int right, int[] temp) {
if(right == left) return 0;
int mid = left + ((right-left)>>1) ;
int leftnum = reversePairs(nums, left, mid, temp);
int rightnum = reversePairs(nums, mid+1, right, temp);
int midnum = mergersort(nums, left, mid, right, temp);
return midnum+leftnum+rightnum;
}
private int mergersort(int[] nums, int left, int mid, int right, int[] temp) {
int p = left, q = mid+1, index = left, count = 0;
while(p <= mid && q <= right){
if(nums[p] <= nums[q]){
temp[index++] = nums[p++];
}else{
temp[index++] = nums[q++];
count += mid-p+1;
}
}
while(p <= mid) temp[index++] = nums[p++];
while(q <= right) temp[index++] = nums[q++];
for(int i = left; i<=right; i++) nums[i] = temp[i];
return count;
}
}
class Solution {
public int reversePairs(int[] nums) {
int len = nums.length;
if(len < 2) return 0;
return reversePairs(nums, 0, len-1, new int[len]);
}
public int reversePairs(int[] nums, int left, int right, int[] temp){
if(left >= right) return 0;
int mid = left + (right-left)/2;
int leftnum = reversePairs(nums, left, mid, temp);
int rightnum = reversePairs(nums, mid+1, right, temp);
int midnum = merge(nums, left, mid, right, temp);
return midnum+rightnum+leftnum;
}
public int merge(int[] nums, int left, int mid, int right, int[] temp){
int p = left, q = mid+1, count = 0, index = left;
while(p <= mid && q <= right){
if(nums[p] > (long)nums[q]*2){
count+=mid-p+1;
q++;
}else
p++;
}
p = left;
q = mid+1;
while(p <= mid && q <= right){
if(nums[p] <= nums[q]){
temp[index++] = nums[p++];
}else{
temp[index++] = nums[q++];
}
}
while(p <= mid) temp[index++] = nums[p++];
while(q <= right) temp[index++] = nums[q++];
for(int i = left; i<= right; i++) nums[i] = temp[i];
return count;
}
}