1. 程式人生 > 實用技巧 >AcWing101 最高的牛 (差分)

AcWing101 最高的牛 (差分)

題目描述

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

剛開始的演算法,由於遞迴涉及到大量重複計算的問題,使得執行超時

class Solution {
public:
    int InversePairs(vector<int
> data) { if(data.size()==0) return 0; int len = data.size(); int * array = new int[len]; //memset(array, 0, data.size()*sizeof(array)); for(int i=0;i<len;i++){ array[i] = 0; } divideInversePairs(data,0,data.size()-1,array);
int sum = 0; for(int i = 0;i<len;i++){ sum += array[i]; } return sum%1000000007; } void CombineInversePairs(vector<int> data,int low,int mid, int high,int array[]){ for(int i = low;i<=mid;i++){ for(int j=mid+1
;j<=high;j++){ if(data[i]>data[j]) array[i]++; } } } void divideInversePairs(vector<int> data,int low, int high,int array[]){ if(low<high){ int mid = low + (high - low)/2; divideInversePairs(data, low, mid, array); divideInversePairs(data, mid+1, high, array); CombineInversePairs(data,low,mid,high,array); } } };