LeetCode 493 翻轉對 歸併排序

2021-10-10 22:38:27 字數 1182 閱讀 6939

如果 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。輸入陣列中的所有...