劍指offer 面試題51 數組中的逆序對

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

tips: 使用歸併排序,記得用long long

class Solution {
public:
    long long mergeSortAndCount(vector<int> &data, int begin, int end) {
        vector<int> temp;
        if(begin==end) {
            return 0;
        }
        int mid=(begin+end)/2;
        long long left=mergeSortAndCount(data,begin,mid);
        long long right=mergeSortAndCount(data,mid+1,end);
        int index1=begin;
        int index2=mid+1;
        long long count=0;
        while( index1<=mid && index2<=end ) {
            if(data[index1]>data[index2]) {
                temp.push_back(data[index2]);
                index2++;
                count+=mid-index1+1;
            } else {
                temp.push_back(data[index1]);
                index1++;
            }
        }
        for (int i = index1; i <= mid; i++)
        {
            temp.push_back(data[i]);
        }
        for (int i = index2; i <= end; i++)
        {
            temp.push_back(data[i]);
        }
        for (int i = 0; i < temp.size(); i++)
        {
            data[begin+i]=temp[i];
        }
        return (count+left+right)%1000000007;
    }
    int InversePairs(vector<int> data) {
        if(data.size()<=0) {
            return 0;
        }
        return mergeSortAndCount(data,0,data.size()-1);
    }
};
發佈了94 篇原創文章 · 獲贊 10 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章