Leetcode Array 53 最大子序和

2021-10-06 07:23:31 字數 1914 閱讀 3543

給定乙個整數陣列 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...