給定乙個整數陣列 nums ,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。
示例:輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。
高階:如果你已經實現複雜度為 o(n) 的解法,嘗試使用更為精妙的分治法求解。
解法一:dp(動態規劃思想)
不斷的比較累加值和當前值,有兩種情況:1.累加值》當前值,則後續加下去的累加可能會更大;2.累加值《當前值,則還不如放棄前面的累加,直接從當前值開始。與此同時還要用max函式不斷比較temp\temp+nums[i]\max_\nums[i]之間的最大值。因為temp是暫時的最大值,而max_記錄的是一直以來的最大值。
解法二:分治法(遞迴演算法)
對於乙個列表的最大子序和,要麼出現在左半子序,要麼右半,要麼穿過中間。對於左、右半子序也是如此;對於穿過中間子序,可以直接計算,其中temp=0,因為可以只取穿過中間的最小子序。
解法一:dp(動態規劃思想)
class
solution
:def
maxsubarray
(self, nums: list[
int])-
>
int:
lens=
len(nums)
temp=nums[0]
max_=temp
for i in
range(1
,lens)
:if temp+nums[i]
>nums[i]
:#若累加值》當前值則後續加下去的累加可能會更大
max_=
max(max_,temp,temp+nums[i]
) temp=temp+nums[i]
else
:#若累加值《當前值,則還不如放棄前面的累加,直接從當前值開始
max_=
max(max_,temp,temp+nums[i]
,nums[i]
) temp=nums[i]
return max_
解法二:分治法(遞迴演算法)
class
solution
:def
maxsubarray
(self, nums: list[
int])-
>
int:
lens=
len(nums)
if lens==1:
return nums[0]
else
: max_left=self.maxsubarray(nums[
0:lens//2]
) max_right=self.maxsubarray(nums[lens//2:
])max_l=nums[lens//2-
1]temp_l=
0for i in
range
(lens//2-
1,-1
,-1)
: temp_l += nums[i]
max_l=
max(temp_l,max_l)
max_r=nums[lens//2]
temp_r=
0for i in
range
(lens//
2,lens)
: temp_r +=nums[i]
max_r=
max(temp_r,max_r)
return
max(max_left,max_right,max_l+max_r)
Leetcode Array 27 移除元素
給你乙個陣列 nums 和乙個值 val,你需要 原地 移除所有數值等於 val 的元素,並返回移除後陣列的新長度。不要使用額外的陣列空間,你必須僅使用 o 1 額外空間並 原地 修改輸入陣列。元素的順序可以改變。你不需要考慮陣列中超出新長度後面的元素。示例 1 給定 nums 3,2,2,3 va...
Leetcode Array 169 多數元素
給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列 現次數大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。示例 1 輸入 3,2,3 輸出 3 示例 2 輸入 2,2,1,1,1,2,2 輸出 2 解法一 暴力解法 其實也不算暴力解法,就是使用pytho...
Leetcode Array 1 兩數之和
給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9...