leetcode493(翻轉對 歸併排序)

2021-10-10 22:48:55 字數 1530 閱讀 9982

給定乙個陣列 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我們就將 (i, j) 稱作乙個重要翻轉對。

你需要返回給定陣列中的重要翻轉對的數量。

示例 1:

輸入: [1,3,2,3,1]

輸出: 2

示例 2:

輸入: [2,4,3,5,1]

輸出: 3

題解(一):歸併排序,在歸併排序的過程中,假設對於某歸併陣列而言,我們已經分別求出了其左右子陣列的翻轉對數目,並已將左右子陣列分別排好序,則該陣列中的翻轉對數目,就等於兩個子陣列的翻轉對數目之和,加上翻轉對左右端點分別位於左右兩個子陣列的翻轉對數目。

class

solution

//歸併排序演算法

public

intmergesort

(int

nums,

int left,

int right)

ans+=

(right_bound-mid-1)

; left_bound++;}

int[

]sorted=

newint

[right-left+1]

;int leftptr=left;

int rightptr=mid+1;

int i=0;

//左右兩個有序陣列合併

while

(leftptr<=mid||rightptr<=right)

else

if(rightptr>right)

else

else}}

for(

int j =

0; j < sorted.length; j++

)return ans;

}}

題解(二):構造樹狀陣列

class

solution

// 利用雜湊對映將離散整數投影到連續空間

mapvalues =

newhashmap

();int idx =0;

for(

long x : allnumbers)

int ret =0;

tree bit =

newtree

(values.

size()

);for(

int i =

0; i < nums.length; i++

)return ret;}}

//樹狀陣列類

class

tree

public

static

intlowbit

(int x)

public

void

update

(int x,

int d)

}public

intquery

(int x)

return ans;

}}

LeetCode 493 翻轉對 歸併排序

如果 i j 分別屬於兩個有序區間,並且 nums i 2 nums j 則大於 i 的元素也都滿足需求,利用有序特點可以減少重複的比較操作。將兩個有序的陣列合併成乙個有序陣列稱為歸併。歸併排序包含了兩個過程 從上往下的分解 把當前區間一分為二,直至分解為若干個長度為1的子陣列 從下往上的合併 兩個...

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