在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數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法1:暴力遍歷,對0~data.size()的元素,逐個遍歷他後面的數,是逆序對就count++;這樣的時間複雜度是o(n^2);
法2:利用歸併排序的思想,將陣列元素按從大到小進行排序,在進行歸併時,若左側的首元素大於右側首元素,那麼應該count+= end-j+1;
class solution
void merge_sort(vector&data, int first, int end)
}void merge_array(vector& data, int first, int mid, int end, vectortmp)
else
tmp.push_back(data[j++]);
}while(i<=mid)
tmp.push_back(data[i++]);
while(j<=end)
tmp.push_back(data[j++]);
int k=tmp.size();
for(int l=0;ldata[first+l]=tmp[l]; //first表示第幾個歸併小組的起始位置
}};
求陣列逆序對
思路 類似歸併排序演算法,在合併已經有序的相鄰子陣列的時候,計算前面陣列相對於後面陣列的逆序對數,整個遞迴過程可以算出所有逆序對 include void merge int a,int front,int middle,int end,int count else if j end while j...
演算法題 求陣列的逆序對
在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。給你乙個陣列,求出這個陣列中逆序對的總數。概括 如果a i a j 且 i j,a i 和 a j 構成乙個逆序對。樣例 序列 2,4,1,3,5 中,有 3 個逆序對 2,1 4,1 4,3 則返回 3 思路 最簡單的想...
求陣列逆序對數
題目 對於乙個元素個數為n的陣列a,若 a i a j 且0 i j n,則a i 和a j 為乙個逆序對。現在要求給定陣列的逆序對數 解析 對於這乙個題目,最容易想到的方法即順序掃瞄整個陣列。沒掃瞄到乙個元素,則將該元素與其後面的所有元素進行比較,若後面的元素比該元素大,則找到乙個逆序數。這一過程...