LeetCode分類習題 分治

2021-10-23 13:08:49 字數 1425 閱讀 1726

此題思路非常多,主要介紹分治思想的應用和常見其他解法。

求原陣列的眾數可以轉化成求各子陣列的眾數,最後將子陣列的結果合併為原陣列結果。這就涉及兩個問題:

a)遞迴頭。當子陣列只有乙個元素時,眾數即為該元素。

b)合併規則。

class

solution

// 計算左(或右)區間的眾數各自在整個陣列**現了多少次

private

intcountinrange

(int

arr,

int target,

int l,

int r)

return count;

}private

intgetmajority

(int

nums,

int l,

int r)

else

}}

第一步先將陣列中所有元素寫到雜湊表中,以元素為key,出現次數為value。第二步類似氣泡排序第一步,「打擂」的方式找出值最大的entry。返回其鍵即可。

class

solution

else

} map.entry

modeentry = null;

for(map.entry

entry: counts.

entryset()

)}return modeentry.

getkey()

;}}

將原陣列排序後,處於n/2位置的元素必然是「眾數」。

class

solution

}

a)遞迴頭:只有乙個元素的子陣列的最大子序和就是該元素。

b)合併準則:總的最大子序和必然是是由各子問題(只有乙個元素)的最大子序和相加而成。

class

solution

int max_r = nums[nums.length /2]

;int temp =0;

for(

int j = nums.length /

2;j < nums.length;j++

)int max_lr = math.

max(left, right)

;return max_lr >

(max_l + max_r)

? max_lr:

(max_l + max_r);}

}

本質和分治類似,每一步的狀態取決於前一步的狀態(截止當前元素時的最大子序和),那任務也是找到:

a)遞迴頭:即dp中的邊界條件,dp[0] = nums[0]

b)合併規則:如果當前元素大於0,dp[i] = dp[i-1] + nums[i];否則dp[i-1]

Leetcode分類 遞迴 回溯 分治

回溯是一種應用遞迴演算法,遞迴不是 題目迴圈的困難之處在於不好模擬選不選某乙個數的過程,即選了乙個數,不方便回溯到不選這個數的情況。給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 nums 1 2,3 輸出 3 1 2 1,2,3 ...

Leetcode 分治演算法

題目描述 在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。示例 1 輸入 3,2,1,5,6,4 和 k 2 輸出 5 解法 堆 思路 建立乙個大頂堆,並保持堆的大小小於等於k。堆內的排序從堆頂遞增,最後的堆頂就是所求。時間...

leetcode 佇列習題

最近的請求次數 寫乙個 recentcounter 類來計算最近的請求。它只有乙個方法 ping int t 其中 t 代表以毫秒為單位的某個時間。返回從 3000 毫秒前到現在的 ping 數。任何處於 t 3000,t 時間範圍之內的 ping 都將會被計算在內,包括當前 指 t 時刻 的 pi...