有三種解決,分別是暴力法,滑窗,分治法。
暴力法的解法是尋找所有子串行,分別求和然後找到最大的那個。使用快慢指標就能實現。雙重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 表示最後一項為...