在牛客網上看到這樣一道題:
在數組中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007
輸入描述:
題目保證輸入的數組中沒有的相同的數字
數據範圍:
對於%50的數據,size<=10^4
對於%75的數據,size<=10^5
對於%100的數據,size<=2*10^5
輸入例子:1,2,3,4,5,6,7,0
輸出例子:7
function InversePairs(data)
{
// write code here
var tempArr = new Array(data.length);
var count = InversePairsCore(data,0,data.length-1,tempArr);
return count%1000000007;
}
function Merge(arr,start,mid,end,tempArr){
var i = mid, j = end, count = 0, k = 0;
while(i >= start && j > mid){
if(arr[i] > arr[j]){
count += (j-mid);
tempArr[k++] = arr[i--];
}else{
tempArr[k++] = arr[j--];
}
}
while(i >= start){
tempArr[k++] = arr[i--];
}
while(j > mid){
tempArr[k++] = arr[j--];
}
for(var l = 0;l < k;l++){
arr[end-l] = tempArr[l]
}
return count%1000000007 ;
}
function InversePairsCore(arr, start, end, tempArr){
var count = 0;
if(start < end){
var mid = Math.floor((end + start)/2);
count += InversePairsCore(arr,start,mid,tempArr);
count += InversePairsCore(arr,mid+1,end,tempArr);
count += Merge(arr,start,mid,end,tempArr);
}
return count%1000000007 ;
}
module.exports = {
InversePairs : InversePairs
};