在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。
示例 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陣列的緩衝空...