給定乙個陣列 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。輸入陣列中的所有...