NowCoder:数组中的逆序对(归并排序)

问题描述

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007

 class Solution {
public:
    int InversePairs(vector<int> data) {
        int n= data.size();
        long long int result;
        vector<int> temp=data;
        result= merge_sort(data,0,n-1,temp);
        return result%1000000007;
    }
long long int  merge(vector<int> &data,int start,int mid,int end,vector<int> &temp){
    int i=start,j=mid+1,k=start;
    long cnt=0;   //这里很重要
    while (i<=mid&&j<=end)
    {
        if(data[i]>data[j]){
            temp[k++]=data[j++];cnt+=mid-i+1;
        }
        else{
            temp[k++]=data[i++];
        }
    }
    while (i<=mid)
    {
        temp[k++]=data[i++];
    }
    while (j<=end)
    {
        temp[k++]=data[j++];
    }
    for (int i=start;i<=end;i++)  //这里忘了将临时数组的值还回去,这样每次白排序了
    {
        data[i]=temp[i];
    }
    return cnt;
}
long long int merge_sort(vector<int> &data,int start,int end,vector<int> &temp ){
    int mid;
    long cnt=0;  //这里很重要
    if(start==end){
        temp[start]=data[start];
    }
    else{
        mid=(start+end)/2;
        cnt+=merge_sort(data,start,mid,temp);//这里也要加cnt,每个递归的mergeSort的值都要加起来,为防止错误,最好用全局变量
        cnt+=merge_sort(data,mid+1,end,temp);
        cnt+=merge(data,start,mid,end,temp);
    }
    return cnt;
}
};

注意事项

1.一定要注意数字越界。。。。。int 和long我曹溢出了。。。
2.vector的使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 说明: 本文中出现的所有算法题皆来自牛客网-剑指Offer在线编程题,在此只是作为转载和记录,用于本人学习使用,不...
    秋意思寒阅读 4,836评论 1 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,899评论 18 399
  • 题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组...
    quiterr阅读 1,729评论 0 0
  • 霓虹万丈闪烁 渗入深夜的流气 孤立的路灯照亮近旁的三分地 时有情人环抱在树底呢喃耳语 一整条街都是KTV 一行人都...
    小5写日记阅读 2,629评论 1 0
  • 他们去了玩乐国,国民全部由八到十二岁的孩子组成,这里孩子们玩法五花八门,巨大的喧嚣声能让耳朵没有塞上棉球的人变成聋...
    三城一郭阅读 1,540评论 0 0