题目链接
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
限制:
题解思路-归并排序
主要理解归并排序,题解懒得写
代码
class Solution {
int count = 0;
public int reversePairs(int[] nums) {
int len = nums.length;
if (len < 2) {
return 0;
}
split(nums, 0, len - 1);
return count;
}
void split(int[] nums, int start, int end) {
if (start == end) {
return;
}
int mid = (start + end) >> 1;
split(nums, start, mid);
split(nums, mid + 1, end);
merge(nums, start, mid, end);
}
void merge(int[]nums, int start, int mid, int end) {
int[] tmp = new int[end - start + 1];
int i = start;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= end) {
if (nums[i] <= nums[j]) {
tmp[k++] = nums[i++];
} else {
count += (mid + 1 - i);
tmp[k++] = nums[j++];
}
}
while (i <= mid) {
tmp[k++] = nums[i++];
}
while (j <= end) {
tmp[k++] = nums[j++];
}
for (int i1 = 0; i1 < tmp.length; i1++) {
nums[start + i1] = tmp[i1];
}
}
}
时间复杂度
O(nlog(n))
|