題目:
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。
思路:歸併排序的合併過程。主要是考慮合併兩個有序序列時,計算逆序對數。
對於兩個公升序序列,設定兩個下標:兩個有序序列的末尾。每次比較兩個末尾值,如果前末尾大於後末尾值,則有」後序列當前長度「個逆序對;否則不構成逆序對。然後把較大值拷貝到輔助陣列的末尾,即最終要將兩個有序序列合併到輔助陣列並有序。
這樣,每次在合併前,先遞迴地處理左半段、右半段,則左、右半段有序,且左右半段的逆序對數可得到,再計算左右半段合併時逆序對的個數。
總個數=左個數+右個數+左右合併時的個數
注意:注意inversepairscore形參的順序是(data,copy),而遞迴呼叫時實參是(copy,data)。
要明白遞迴函式inversepairscore的作用就行了,它是對data的左右半段進行合併,複製到輔助陣列copy中有序。
最後,data和copy兩個陣列都是有序的。
**:
classsolution
private
:
int inversepairscore(vector &data,vector ©, int begin, int
end)
else
else
}for(;pre>=begin;--pre)
copy[cpindex--]=data[pre];
for(;post>=mid+1;--post)
copy[cpindex--]=data[post];
return left+right+cnt;}}
};
劍指offer 面試題36 陣列中的逆序對
題目 在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。例如在陣列中一共存在5對逆序對,分別是 7,6 7,5 7,4 6,4 5,4 基本思想 解法一 o n 2 最簡單的想法就是遍歷每乙個元素,讓其與後面的元素對比,如果大於...
劍指Offer之面試題36 陣列中的逆序對
所有 均通過g 編譯器 測試,僅為練手紀錄。面試題36 陣列中的逆序對 題目 在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。面試題36 陣列中的逆序對 題目 在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成...
《劍指offer》陣列相關面試題
在乙個長度為n的陣列裡所有數字都在0 n 1範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複,也不知道重複了幾次,請找出陣列中任意乙個重複的數字。例如,長度為7的陣列,那麼對應的輸出應該是重複的數字2或者3.思路 重排這個陣列,從頭到尾依次掃瞄這個陣列中的每個數字。掃到下標為i的數字m時 首先...