LeetCode sword refers to Offer 51. Reversed pairs in the array

LeetCode sword refers to Offer 51. Reversed pairs in the array


Problem Description

insert image description here

Brief idea

Use the divide and conquer idea of ​​merge sort.
res = merge_sort(nums, l, mid) + merge_sort(nums, mid+1, r) calculates the reverse order pair of each part after splitting.
res += mid-i+1; Computes the reverse order pair between two parts.

ps. Idea source: y total AcWing merge sort template question.

the code

class Solution {
    
    
public:
    int temp[50010];

    long long merge_sort(vector<int> &nums, int l, int r){
    
    
        if(l >= r) return 0;
        
        int mid = (l+r)/2;
        long long res = merge_sort(nums, l, mid) + merge_sort(nums, mid+1, r);

        int k = 0, i = l, j = mid+1;
        while(i <= mid && j <= r){
    
    
            if(nums[i] <= nums[j]) temp[k++] = nums[i++];
            else{
    
    
                temp[k++] = nums[j++];
                res += mid-i+1;
            }
        }

        while(i <= mid) temp[k++] = nums[i++];
        while(j <= r) temp[k++] = nums[j++];

        for(i=l, j=0; i <= r; i++,j++) nums[i] = temp[j];

        return res; 
    }

    int reversePairs(vector<int>& nums) {
    
    
        int n = nums.size();
        return merge_sort(nums, 0, n-1);
    }
};

Guess you like

Origin blog.csdn.net/qq_45438600/article/details/116896990