此題思路非常多,主要介紹分治思想的應用和常見其他解法。
求原陣列的眾數可以轉化成求各子陣列的眾數,最後將子陣列的結果合併為原陣列結果。這就涉及兩個問題:
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...