493. 翻转对 归并排序

在这里插入图片描述

先学习求普通的逆序对剑指 Offer 51. 数组中的逆序对

本题思路:如果左边的第i个是右边的第j个的2 倍之多,则i之后的||L||-i 都是满足要求的逆序对,则j++来判断i能否可以和j之后的成为满足要求的逆序对,否则来判断i之后的能否可以和j满足要求的逆序对,即i++

class Solution {
public:
    int sort_and_count(vector<int>&A,int start,int end){
        if(start<end) {
            int mid=start+(end-start)/2;
            int RC_L=sort_and_count(A,start,mid);

             int RC_R=sort_and_count(A,mid+1,end);
             int C=merge_and_count(A,start,mid,end);
             return RC_L+RC_R+C;
        }
        return 0;
    }
    int merge_and_count(vector<int>& A,int start,int mid,int end){
        // L= A[start:mid] R=A[mid+1,end]
        // RC 表示逆序 reversed count 个数
        int RC=0,i=start,j=mid+1,k=0;
  
        // vector<int>res(end-start+1); 
        int res[end-start+1];
// 先合并
        while(i<=mid&&j<=end){
             if(A[i]>A[j])
                res[k]=A[j++];
            else 
                res[k]=A[i++];
            k++;
        }

        while(i<=mid) res[k++]=A[i++];
        while(j<=end) res[k++]=A[j++];
// 后统计
        i=start,j=mid+1;
        while(i<=mid&&j<=end){
             if((long long )A[i]>2*(long long )A[j]){
                j++;
                RC+=mid-i+1;
             }
            else i++; 
        }

        for( k=0;k<=end-start;k++) A[k+start]=res[k];
        return RC;

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

猜你喜欢

转载自blog.csdn.net/qq_38662930/article/details/107501313
今日推荐