劍指offer 面試題36 陣列中的逆序對

2022-03-27 00:32:51 字數 859 閱讀 6447

題目:

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。

思路:歸併排序的合併過程。主要是考慮合併兩個有序序列時,計算逆序對數。

對於兩個公升序序列,設定兩個下標:兩個有序序列的末尾。每次比較兩個末尾值,如果前末尾大於後末尾值,則有」後序列當前長度「個逆序對;否則不構成逆序對。然後把較大值拷貝到輔助陣列的末尾,即最終要將兩個有序序列合併到輔助陣列並有序。

這樣,每次在合併前,先遞迴地處理左半段、右半段,則左、右半段有序,且左右半段的逆序對數可得到,再計算左右半段合併時逆序對的個數。

總個數=左個數+右個數+左右合併時的個數

注意:注意inversepairscore形參的順序是(data,copy),而遞迴呼叫時實參是(copy,data)。

要明白遞迴函式inversepairscore的作用就行了,它是對data的左右半段進行合併,複製到輔助陣列copy中有序。

最後,data和copy兩個陣列都是有序的。

**:

class

solution

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時 首先...