參考部落格:
題目描述:
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。 即輸出p%1000000007
輸入描述:
題目保證輸入的陣列中沒有的相同的數字
資料範圍:
對於%50的資料,size<=10^4
對於%75的資料,size<=10^5
對於%100的資料,size<=2*10^5
思路:
基於歸併排序的思想統計逆序對:先把陣列分割成子陣列,再子陣列合併的過程中統計逆序對的數目。統計逆序對時,先統計子陣列內部的逆序對的數目,再統計相鄰子陣列的逆序對數目。
利用歸併排序:比如 9 5 7 4把長度為4的陣列分解成長度為2的分組,把長度為2的陣列分解成長度為1的陣列->95 74 ->9 5 7 4
合併排序->59 74 ->4579主要的演算法在merge裡面 因為合併排序後的資料比如:6789 2345。。。6大於2則6789均大於2,cnt+=4;6大於3則6789均大於3,cnt+=4;6大於3則6789均大於3,cnt+=4;6大於4則6789均大於4,cnt+=4;
詳見**:
#include
#include
using
namespace std;
int cnt =0;
void
merge
(vector<
int>
& data,
int start,
int mid,
int end)
else
tmp.
push_back
(data[i++])
;//6789 10 11 12 13 6小於10 那麼tmp.push_back(6)
}//tmp就是存data(start,end)區間內從小到大的儲存起來
while
(i <= mid)
while
(j <=end)
for(
int i =
0; i < tmp.
size()
;++i)
}void
mergesort
(vector<
int>
& data,
int start,
int end)
//分解
}int
inversepairs
(vector<
int> data)
return cnt;
}void
main()
;//答案為:2519
//vectordata = ;
//答案為:7
//vectordata = ;
//答案為:7
cout <<
inversepairs
(data)
<< endl;
cin.
get();
return
;}
9 陣列中的逆序對 C
class solution void onesort vector int data,vector int temp,int left,int mid,int right while i mid temp start data i while j right temp start data j w...
陣列中逆序對
題目 在陣列中的兩個數字,如果前面的乙個數字大於後面的數字,則這兩個數字為乙個逆序對。輸入乙個陣列,求這個陣列的逆序對個數。例如 給定陣列 則有 5,3 5,1 8,3 8,1 3,1 這5個逆序對。問題分析 我採用兩種方法來解決這個問題 1 考慮到二叉搜尋樹中每個節點x,它的左子樹所有關鍵字的值小...
陣列中的逆序對
來自劍指offer 分析 我們第一反應是順序掃瞄整個陣列,每掃瞄到乙個數字時,逐個比較該數字和它後面的數字的大小。如果後面的數字比它小,則這個兩個數字就組成了乙個逆序對。假設陣列有n個數字,由於每個數字都要和o n 個數字作比較,因此這個演算法的時間複雜度為o n 2 換思路 我們採用歸併思想,先考...