剑指offer:数组中的逆序对

来源:互联网 发布:db2 设置数据库编码 编辑:程序博客网 时间:2024/05/29 09:35

题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5

class Solution {public:    long InversePairsCore( vector<int> &data, vector<int> &copy, long start, long end){        if(start == end)  // copy: 辅助数组        {            return 0 ;  // 递归终止条件        }        long mid = (start + end)/ 2 ;        long left = InversePairsCore(copy,data, start, mid); // 递归,归并排序,并计算本次逆序对数        long right = InversePairsCore(copy,data, mid+1, end);        long crossCount = 0 ;       // 记录交叉的逆序对数        long i = mid, j = end, temp = end;  //i:前半部分的下标,j:后半部分的下标,temp:辅助数组的下标        while(i >= start && j >= mid+1) {   // 存在交叉的逆序对,先统计一下,然后依次将较大值放进辅助数组            if (data[i] > data[j]) {                copy[temp--] = data[i--];                crossCount += j - start - (mid-start);            } else {                copy[temp--] = data[j--];   // 不存在交叉的逆序对,依次将较大值放进辅助数组            }        }        while(i >= start) {            copy[temp--] = data[i--];        }        while(j >=mid+1) {            copy[temp--] = data[j--];        }            return (left + right + crossCount) % 1000000007; //数值过大时求余, 防止溢出    }    int InversePairs(vector<int> &data) {        if(data. size () == 0 ) return 0 ;        else if (data. size() == 1 ) return 1 ;        else {            vector<int> copy(data);            return InversePairsCore(copy, data, 0 , data.size()- 1);        }    }};