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

数组中的逆序对

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

public:
    int temp[100005];
    int InversePairs(vector<int> data) {
        vector<int>copy;
        for(int i=0;i<data.size();i++){//先保存下来
            copy.push_back(data[i]);
        }
        return InversePairs1(data,0,data.size()-1);
    }
    int InversePairs1(vector<int> &data,int left,int right){
        if(left==right)return 0;//递归到只有一个数
        int mid=(left+right)/2;//先进行分治递归
        //遍历左右子树,直至只有一个数
        int leftInversePairs1=InversePairs1(data,left,mid);
        int rightInversePairs1=InversePairs1(data,mid+1,right);
        //左右子树都是有序的,逆序对在合并的过程中计算
        int  merge=merge_sort(data,left,mid,right);
        return (leftInversePairs1+rightInversePairs1+merge)%1000000007;
    }
    int merge_sort(vector<int> &data,int left,int mid,int right){
        for(int i=left;i<=right;i++){
            temp[i] = data[i];//把所有值赋给临时数组,等下归并时要用
        }
        int i=left;
        int j=mid+1;
        int count=0;
        //通过双指针比较 对两段数进行排序,并计算逆序对
        for(int k=left;k<=right;k++){
            if(mid+1==i){//左端先完
                data[k]=temp[j];
                j++;
            }else if(j==right+1){
                data[k]=temp[i];//右端先完
                i++;
            }else if(temp[i]<=temp[j]){
                data[k]=temp[i];
                i++;
            }
            else if(temp[i]>temp[j]){
                data[k]=temp[j];
                count+=(mid+1-i);
                j++;
            }
        
        }
        return count%1000000007;//不模不行
    }
};
全部评论

相关推荐

AI牛可乐:哇,听起来你很激动呢!杭州灵枢维度科技听起来很厉害呀~你逃课去白马培训,老冯会同意吗?不过既然你这么感兴趣,肯定是有原因的吧! 对了,想了解更多关于这家公司或者求职相关的问题吗?可以点击我的头像私信我哦,我可以帮你更详细地分析一下!
你都用vibe codi...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务