【剑指offer35 数组中的逆序对】

2021-05-13 12:28

阅读:524

标签:int   public   core   ret   tar   剑指offer   start   大于   art   

题目描述

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

public:
    int InversePairs(vectorint> data) {
        int length=data.size();
        if(length0)
            return 0;
       //vector copy=new vector[length];
       vectorint> copy;
       for(int i=0;i)
           copy.push_back(data[i]); //复制一份
       long long count=InversePairsCore(data,copy,0,length-1);
       //delete[]copy;
       return count%1000000007;
    }
    
    long long InversePairsCore(vectorint> &data,vectorint> &copy,int start,int end)
    {
       if(start==end)
          {
            copy[start]=data[start];
            return 0;
          }
       int length=(end-start)/2;
        //拆分成左右两部分 递归
       long long left=InversePairsCore(copy,data,start,start+length);
       long long right=InversePairsCore(copy,data,start+length+1,end); 
        
       int i=start+length; //指向左边的尾
       int j=end;
       int indexcopy=end;
       long long count=0;
       while(i>=start&&j>=start+length+1)
          {
             if(data[i]>data[j])
                {
                  copy[indexcopy--]=data[i--];
                  //右边此时指向位置的前面的都比data[i]小
                  count += j-start-length;          //count+= (j-(start+length+1))+1;
                }
             else
                {//保证合并的数组是->升序的
                  copy[indexcopy--]=data[j--];
                }          
          }
       for(;i>=start;i--)
           copy[indexcopy--]=data[i];
       for(;j>=start+length+1;j--)
           copy[indexcopy--]=data[j];       
       return left+right+count;
    }
};

 

【剑指offer35 数组中的逆序对】

标签:int   public   core   ret   tar   剑指offer   start   大于   art   

原文地址:https://www.cnblogs.com/Stephen-Jixing/p/13130247.html


评论


亲,登录后才可以留言!