[LeetCode] 面试题51. 数组中的逆序对
标签:pair solution pairs 访问 逆序 merge vat 数组中的逆序对 代码
class Solution {
public int reversePairs(int[] nums) {
int len = nums.length;
if(len){
return 0;
}
int[] copy = new int[len];
for(int i=0;i){
copy[i]=nums[i];
}
int[] temp=new int[len];
return reversePairs(copy,0,len-1,temp);
}
private int reversePairs(int[] nums, int left, int right, int[] temp) {
if (left == right) {
return 0;
}
int mid = left + (right - left) / 2;
int leftPairs = reversePairs(nums, left, mid, temp);
int rightPairs = reversePairs(nums, mid + 1, right, temp);
// 如果整个数组已经有序,则无需合并,注意这里使用小于等于
if (nums[mid] ]) {
return leftPairs + rightPairs;
}
int crossPairs = mergeAndCount(nums, left, mid, right, temp);
return leftPairs + rightPairs + crossPairs;
}
private int mergeAndCount(int[] nums, int left, int mid, int right, int[] temp) {
for (int i = left; i ) {
temp[i] = nums[i];
}
int i = left;
int j = mid + 1;
int count = 0;
for (int k = left; k ) {
// 有下标访问,得先判断是否越界
if (i == mid + 1) {
nums[k] = temp[j];
j++;
} else if (j == right + 1) {
nums[k] = temp[i];
i++;
} else if (temp[i] temp[j]) {
// 注意:这里是
nums[k] = temp[i];
i++;
} else {
nums[k] = temp[j];
j++;
// 在 j 指向的元素归并回去的时候,计算逆序对的个数,只多了这一行代码
count += (mid - i + 1);
}
}
return count;
}
}
这道题也难欸
[LeetCode] 面试题51. 数组中的逆序对
标签:pair solution pairs 访问 逆序 merge vat 数组中的逆序对 代码
原文地址:https://www.cnblogs.com/doyi111/p/12771051.html
评论