暴力法:(超时)
class Solution {
public int reversePairs(int[] nums) {
int sum = 0;
for (int i = 0; i < nums.length - 1; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] > nums[j]) {
sum++;
}
}
}
return sum;
}
}
利用归并排序来做:
class Solution {
int[] nums, temp;
public int mergeSort(int l, int r) {
if (l >= r) {
return 0;
}
int m = (l + r) / 2;
int res = mergeSort(l, m) + mergeSort(m + 1, r);
for (int k = l; k <= r; k++) {
temp[k] = nums[k];
}
int i = l, j = m + 1;
for (int k = l; k <= r; k++) {
// 这种条件判断顺序好理解,但是会出现数组下标越界的情况,需要调整条件判断的顺序
// if (temp[i] <= temp[j]) {
// nums[k] = temp[i++];
// } else if (i == (m + 1)) {
// nums[k] = temp[j++];
// } else if (temp[i] > temp[j]) {
// nums[k] = temp[j++];
// res += m- i + 1;
// } else if (j == r + 1) {
// nums[k] = temp[i++];
// }
if (i == (m + 1)) {
nums[k] = temp[j++];
} else if (j == r + 1) {
nums[k] = temp[i++];
} else if (temp[i] > temp[j]) {
nums[k] = temp[j++];
res += m- i + 1;
} else if (temp[i] <= temp[j]) {
nums[k] = temp[i++];
}
}
return res;
}
public int reversePairs(int[] nums) {
this.nums = nums;
temp = new int[nums.length];
return mergeSort(0, nums.length - 1);
}
}