分治 歸併排序 面試題51 陣列中的逆序對

2021-10-05 10:33:10 字數 1243 閱讀 5620

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

示例 1:

輸入:[7

,5,6

,4]輸出:

5

解題

暴力法:

遍歷每乙個數字,和其後面的數字,找到所有的逆序對;

class

solution

sum+

=dp[i];}

return sum;}}

;

複雜度o(n^2), 大數超時;

模擬歸併排序,左右的有序陣列重新排序,當右邊陣列有大於左邊陣列的數時,一次可以得到兩個陣列的所有逆序數對;

複雜度o(nlogn)

class

solution

private

:int sum=0;

void

msort

(vector<

int>

&t,int left,

int right,

int tmp)

//歸併left~mid , mid+1~right

void

merge

(vector<

int>

&t,int left,

int mid,

int right ,

int tmp)

}while

(s1<=mid) tmp[start++

]=t[s1++];

while

(s2<=right) tmp[start++

]=t[s2++];

for(

int i=left;i<=right;i++

) t[i]

=tmp[i];}

};

注意點

if(t[mid]多乙個步驟,可以減少左右有序陣列的遍歷;

總結

陣列中的逆序對,涉及兩個數前後位置關係,分治策略有效減少時間開銷;

最長上公升子串行,涉及多個數的前後位置關係,用動態規劃,每次得到以i結尾的上公升子串行長度,可以在o(n^2)時間內完成;

面試題51 陣列中的逆序對 歸併排序實現

難度 困難 2020 4 24每日一題打卡 同題 315 題 計算右側小於當前元素的個數 題目描述 解題思路 一直暴力一直快樂,但是會超時 只要在普通的歸併排序基礎上做一點改進,增加對逆序次數的計算 關鍵在於歸併的 並 這個過程 兩個區間分別在區間內有序,歸併的時候如果是左邊那個比較小,跟後面的不構...

陣列 面試題 10 01 合併排序的陣列

夢想進大廠的乙隻程式猿 期望畢業前力扣刷夠400題 正在複習資料結構和演算法 第乙個方法,借用o m 的空間,將a陣列的數字轉移到新開闢的空間中,然後依次的比較,方放入a陣列中 第二個方法,我們可以想想可以不借用空間的方法來解決這個問題,我們可以看到,兩個陣列的數字都是排序 公升序 好的,我們可以從...

面試題 10 01 合併排序的陣列

給定兩個排序後的陣列 a 和 b,其中 a 的末端有足夠的緩衝空間容納 b。編寫乙個方法,將 b 合併入 a 並排序。初始化 a 和 b 的元素數量分別為 m 和 n。示例 輸入 a 1,2,3,0,0,0 m 3 b 2,5,6 n 3 輸出 1,2,2,3,5,6 直接把b陣列放在a陣列的緩衝空...