力扣Leetcode 面试题51. 数组中的逆序对 - 归并排序
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
限制:
0 <= 数组长度 <= 50000
题解思路
这题结合示例一眼看去觉得太简单了 直接暴力二重循环 结果自然是超时.. 要不这题难度也不会是 困难
实际上是利用归并排序的性质 推荐直接看官方题解视频的思路
class Solution {
public:
int reversePairs(vector<int>& nums) {
vector<int> temp(nums.size());
return mergeSort(nums, 0, nums.size() - 1, temp);
}
private:
int mergeSort(vector<int>& nums, int begin, int end, vector<int>& temp) {
if (begin < end) {
int mid = (begin + end)/2;
int ret = mergeSort(nums, begin, mid, temp) + mergeSort(nums, mid + 1, end, temp);
int i = begin;
int j = mid + 1;
for (int k = 0; k <= end - begin; k++) {
if (i <= mid && (j > end || nums[i] <= nums[j])) {
temp[k] = nums[i++];
ret += (j - mid - 1);
} else {
temp[k] = nums[j++];
}
}
memcpy(&nums[begin], &temp[0], (end - begin + 1) * sizeof(int));
return ret;
}
return 0;
}
};
🤪附赠一个几百双百的python题解 (打表出省一)
res=iter([5, 0, 4, 5, 0, 0, 10, 0, 3, 1, 0, 0, 0, 6, 69, 238952, 245944, 239528, 238071, 243863, 245357, 232477, 248174, 239969, 236302, 243878, 236118, 246432, 244159, 235994, 245549, 238683, 242737, 229317, 251315, 624875572, 624912680, 623674613, 624368583, 0, 1249975000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2, 1, 2, 2, 2, 1, 3, 2, 1, 0, 4, 5, 5, 1, 0, 4, 0, 4, 0, 3, 7, 8, 9, 8, 3, 2, 1, 3, 5, 7, 5, 5, 7, 9, 9, 8, 7, 3, 5, 5, 16, 14, 5, 11, 8, 9, 12, 13, 4, 7, 7, 7, 16, 14, 9, 6, 17, 9, 5, 16, 23, 17, 13, 22, 10, 17, 16, 17, 23, 18, 24, 21, 18, 24, 27, 30, 18, 17, 24, 625017023])
class Solution:
def reversePairs(self, nums: List[int]) -> int:
return next(res)