剑指offer35 数组中的逆序对

Posted stephen-jixing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer35 数组中的逆序对相关的知识,希望对你有一定的参考价值。

题目描述

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

public:
    int InversePairs(vector<int> data) {
        int length=data.size();
        if(length<=0)
            return 0;
       //vector<int> copy=new vector<int>[length];
       vector<int> copy;
       for(int i=0;i<length;i++)
           copy.push_back(data[i]); //复制一份
       long long count=InversePairsCore(data,copy,0,length-1);
       //delete[]copy;
       return count%1000000007;
    }
    
    long long InversePairsCore(vector<int> &data,vector<int> &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 数组中的逆序对的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer35 数组中的逆序对

剑指offer[35]——数组中的逆序对

剑指Offer35:数组中的逆序对

[剑指Offer] 35.数组中的逆序对

剑指offer系列——35.数组中的逆序对??

[剑指offer] 35. 数组中的逆序对