如果 i 、j 分別屬於兩個有序區間,並且 nums[i] > 2*nums[j] ,則大於 i 的元素也都滿足需求,利用有序特點可以減少重複的比較操作。
將兩個有序的陣列合併成乙個有序陣列稱為歸併。歸併排序包含了兩個過程:
①:從上往下的分解:把當前區間一分為二,直至分解為若干個長度為1的子陣列
②:從下往上的合併:兩個有序的子區域兩兩向上合併
歸併排序的一般步驟:
①.分解:把當前區間一分為二,分解點即中間點mid = (left+right)/2
②.求解:分別遞迴左右兩個子區間[left…mid] 和 [mid+1…right]進行歸併排序。遞迴的終結條件是子區間長度為1。
③.合併:把兩個有序子陣列合併需要占用乙個臨時空間,依次挪動兩個子區間的指標,比較元素值大小,將較小的值存入臨時空間的開頭。將兩個有序區間歸併成乙個臨時有序區間[left…right],並將結果拷貝到原陣列的區間[left…right],使原始陣列[left…right]變為有序。
對於本題而言,在歸併之前進行翻轉對的數量統計即可。
class
solution
void
mergesort
( vector<
int>
& nums ,vector<
int>
& temp,
int left,
int right,
int&result)
else
} i = left;
j = mid+1;
int t =0;
while
( i <= mid && j <= right )
//進行歸併操作
else
}while
( i <= mid )
//將左邊剩餘元素填充進temp中
while
( j <= right )
//將右序列剩餘元素填充進temp中
t =0;
while
( left <= right )
//將temp中的元素全部拷貝到原陣列[left,right]中}}
;
leetcode493(翻轉對 歸併排序)
給定乙個陣列 nums 如果 i j 且 nums i 2 nums j 我們就將 i,j 稱作乙個重要翻轉對。你需要返回給定陣列中的重要翻轉對的數量。示例 1 輸入 1,3,2,3,1 輸出 2 示例 2 輸入 2,4,3,5,1 輸出 3 題解 一 歸併排序,在歸併排序的過程中,假設對於某歸併陣...
陣列翻轉 LeetCode 493 翻轉對
給定乙個陣列nums,如果i j且nums i 2 nums j 我們就將 i,j 稱作乙個重要翻轉對。你需要返回給定陣列中的重要翻轉對的數量。示例 輸入 1,3,2,3,1 輸出 2 注意 給定陣列的長度不會超過50000。輸入陣列中的所有數字都在32位整數的表示範圍內 歸併排序可以解決此題,也可...
LeetCode 翻轉對(歸併排序)
給定乙個陣列 nums 如果 i j 且 nums i 2 nums j 我們就將 i,j 稱作乙個重要翻轉對。你需要返回給定陣列中的重要翻轉對的數量。示例 1 輸入 1,3,2,3,1 輸出 2 示例 2 輸入 2,4,3,5,1 輸出 3 注意 給定陣列的長度不會超過50000。輸入陣列中的所有...