剑指offer 数组中的逆序对

题目描述

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

输入描述:

题目保证输入的数组中没有的相同的数字

数据范围:

对于%50的数据,size<=10^4

对于%75的数据,size<=10^5

对于%100的数据,size<=2*10^5

示例1

输入

1,2,3,4,5,6,7,0

输出

7


思路:归并排序的思路。具体参考剑指offer P190。
注意点:归并排序有返回值的时候需要建一个变量进行累加,mergeSort里面记得要将tmp拷贝回原数组里面。vector<int> tmp{vec};或者拷贝的时候,一定要记得i - start。
for (int i = start; i <= end; ++i) {
    data[i] = tmp[i - start];
}

 

class Solution {
public:    
long long mergeSort(vector<int>& data, int start, int mid, int end) {
    int leftEnd = mid, rightEnd = end;
    vector<int> tmp;
    long long count = 0;
    while (leftEnd >= start && rightEnd >= mid + 1) {
        if (data[leftEnd] > data[rightEnd]) {
            count += rightEnd - mid;
            tmp.push_back(data[leftEnd--]);

        }
        else {
            tmp.push_back(data[rightEnd--]);
        }
    }
    while (leftEnd >= start) {
        tmp.push_back(data[leftEnd--]);
    }
    while (rightEnd >= mid + 1) {
        tmp.push_back(data[rightEnd--]);
    }
    sort(tmp.begin(),tmp.end());
    for (int i = start; i <= end; ++i) {
        data[i] = tmp[i - start];
    }
    return count;
}


long long merge(vector<int>& data, int start, int end) {
    if (end <= start) {        
        return 0;
    }
    int mid = start + (end - start) / 2;
    long long result = 0;
    result += merge(data, start, mid);
    result += merge(data, mid + 1, end);
    result += mergeSort(data, start, mid, end);
    return result;
}

int InversePairs(vector<int> data) {
    if (data.size() <= 1) {
        return 0;
    }    
    int start = 0, end = data.size() - 1;
    long long result = merge(data, start, end);
    return result % 1000000007;
}
};

 

 

posted @ 2017-09-07 23:01  zqlucky  阅读(505)  评论(0编辑  收藏  举报