力扣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)
posted @ 2020-04-24 17:33  CoderZjz  阅读(357)  评论(0编辑  收藏  举报