在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。 即輸出p%1000000007
題目保證輸入的陣列中沒有的相同的數字示例1資料範圍:
對於%50的資料,size<=10^4
對於%75的資料,size<=10^5
對於%100的資料,size<=2*10^5
1,2,3,4,5,6,7,0思路:
類似於megersort
先統計子陣列內部的逆序對的數目,然後再統計2個相鄰子陣列之間的逆序對的數目,在統計的過程中,還需要對陣列排序,
排序可以避免重複統計。
37 \ 26 合併的時候,
3 > 2, 所以2的逆序對有2個(32,72)
37與6合併的時候,逆序對有1個(76)
classsolution
else
}while(l_start<=l_end)
while(r_start<=r_end)
//sort
for(int k = left; k<= right;k++)
return
cnt;
}int msort(vector&nums,vector&aux,int left, int
right)
int reversepairs(vector&nums)
};
1c++ 20180725public
class
solution
9private
int fun(int a,int aux,int lo,int
hi)26
else
27 aux[ai--]=a[j--];28}
2930
while(i>=lo)
31 aux[ai--]=a[i--];
32while(j>=mid+1)
33 aux[ai--] =a[j--];
3435
//更新陣列
36for(int k = lo;k<=hi;k++)
37 a[k] =aux[k];
3839
return (left+right+count)%1000000007;40}
41 }
1class
solution
10long
long inversepairscore(std::vector &data,std::vector ©,int lo,int
hi)27
else30}
31while(i>=lo)
32 copy[k--] = data[i--];
33while(j>=mid+1
)34 copy[k--] = data[j--];
35for(int m = lo;m<=hi;m++)
36 data[m] =copy[m];
37return (left+right+cnt)%1000000007;38
}39 };
劍指offer35 陣列中的逆序對
題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 1...
劍指Offer(35) 陣列中的逆序對
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007。例如輸入,輸出5對。分治思想,採用歸併排序的思路來處理。在合併兩個有序序列時,同時計算逆序對數。對...
劍指Offer 35 陣列中的逆序對
題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 1...