1. 程式人生 > >[劍指offer] 35. 陣列中的逆序對

[劍指offer] 35. 陣列中的逆序對

class Solution
{
    int res = 0;
    //
    void Merge(vector<int> &target, vector<int> &copy, int left, int right, int mid)
    {
        int i = left;    // 左半部分的索引
        int j = mid + 1; // 右半部分的索引
        int k = 0;         // 被插入陣列的索引

        while (i <= mid && j <= right)
        {
            
if (target[i] > target[j]) { res += mid - i + 1; res%=1000000007; copy[k++] = target[j++]; } else copy[k++] = target[i++]; } while (i <= mid) copy[k++] = target[i++];
while (j <= right) copy[k++] = target[j++]; k = 0; while (left <= right) { target[left++] = copy[k++]; } } // void MergeSort(vector<int> &target, vector<int> &copy, int left, int right) { if (left < right) {
int mid = (left + right) / 2; MergeSort(target, copy, left, mid); MergeSort(target, copy, mid + 1, right); Merge(target, copy, left, right, mid); } } void MergeSort(vector<int> &target) { vector<int> copy(target.size()); MergeSort(target, copy, 0, target.size() - 1); } public: int InversePairs(vector<int> data) { if (data.size() == 0) return 0; MergeSort(data); return res; } };

 

題目描述

在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數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


在歸併排序過程中,利用“並”時的比較來記錄逆序對的次數(即左半部分的數字大於右半部分的數字的時候)