LeetCode 53 最大子序和

2021-09-28 13:49:46 字數 1251 閱讀 4824

有三種解決,分別是暴力法,滑窗,分治法。

暴力法的解法是尋找所有子串行,分別求和然後找到最大的那個。使用快慢指標就能實現。雙重for迴圈。

滑窗法的思想是,如果 乙個子串行的和加上後面遍歷到的當前值,比遍歷到的值還小,那麼這個子串行就可以被放棄了,新的子串行的開頭從這個當前值開始。

class solution:

def maxsubarray(self, nums: list[int]) -> int:

for i in range(1,len(nums)):

nums[i] = nums[i] + max(0, nums[i-1])

return max(nums)

從**中可以看出,滑窗法需要從乙個序列的開頭開始不斷計算。可是乙個最大和子串行是在整個序列的某一部分的。所以引出分治法。

分治法:

思路是:分別在序列的前半段,後半段,和中間開始搜尋最大子串行。

其中重點要理解在中間的一段搜尋的過程: 分成兩部分,分別沿著中間的值往左和往右,找到以中間值為起點的最大子串行。然後加起來。

class solution:

def maxsubarray(self, nums: list[int]) -> int:

if len(nums) == 0:

return 0

if len(nums)== 1:

return nums[0]

else:

max_left = self.maxsubarray(nums[: len(nums) // 2])

max_right = self.maxsubarray(nums[len(nums) // 2 :])

max_r = nums[len(nums) //2]

temp = max_r

for i in range(len(nums)//2+1 , len(nums)):

temp += nums[i]

max_r = max(max_r, temp)

max_l = nums[len(nums) //2 -1]

temp = max_l

for i in range(len(nums) //2 -2, -1, -1):

temp += nums[i]

max_l = max(max_l, temp)

return max(max_left, max_right, max_l + max_r)

LeetCode53最大子序和

給定乙個序列 至少含有 1 個數 從該序列中尋找乙個連續的子串行,使得子串行的和最大。例如,給定序列 2,1,3,4,1,2,1,5,4 連續子串行 4,1,2,1 的和最大,為6。擴充套件練習 若你已實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。一開始用的最簡單最直接的方法,挨個的把...

LeetCode 53 最大子序和

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。這道題本來是能做出...

LeetCode 53 最大子序和

題目鏈結 題目描述 給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。解決方法 解題思路 動態規劃,複雜度為 o n 令dp i 表示最後一項為...