题解 | #数组中的逆序对#

数组中的逆序对

http://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5

借鉴了左程云大神算法课里面求小和的思路

public:
    long long  merge(vector<int>& nums,int L,int M,int R ){
        vector<int>help(R-L+1);
        int sum = 0;
        int i = 0;
        int p1 = L;
        int p2 = M+1;
        while(p1<=M&&p2<=R){
            sum += nums[p1]>nums[p2]?(M-p1+1):0;
            help[i++] = nums[p1]<nums[p2]?nums[p1++]:nums[p2++];
        }
        while(p1<=M){
            help[i++] = nums[p1++];
        }
        while(p2<=R){
            help[i++] = nums[p2++];
        }
        for(int j=0;j<R-L+1;j++){
            nums[L+j] = help[j];
        }
        return sum;
    }
    long long  mergesort(vector<int>& nums,int L,int R){
        if(L == R) return 0;
        int M = L+((R-L)>>1);
        return mergesort(nums, L, M)+mergesort(nums, M+1, R)+merge(nums,L,M,R);
        
    }
    int InversePairs(vector<int> data) {
        int L = 0;
        int R = data.size()-1;
        return mergesort(data, L, R)%1000000007;
    }
};
全部评论

相关推荐

待现的未见之事:起码第一句要把自己的优势说出来吧。比如什么xx本27届学生,随时到岗....
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务