LeetCode53:最大子序和(分治思想,Python3实现)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode53:最大子序和(分治思想,Python3实现)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
最大子序和
給定一個整數(shù)數(shù)組 nums ,找到一個具有最大和的連續(xù)子數(shù)組(子數(shù)組最少包含一個元素),返回其最大和。
示例:
分治法求解思路:將原問題轉(zhuǎn)化為求解子問題,通過子問題的解求解原問題的解。
原問題:求整數(shù)數(shù)組中,具有最大和的連續(xù)子數(shù)組。
子問題:取數(shù)組中位于中間位置的值middle,middle左側(cè)的子數(shù)組leftnums,middle右側(cè)子數(shù)組rightnums。分別求leftnums,rightnums中最大和left和right,和包含中間值middle并跨越leftnums和rightnums的最大和mid。最終結(jié)果為max(left, mid, right).
遞歸求解子問題,獲得原問題的解。
Python3代碼示例:
class Solution:def maxSubArray(self, nums: List[int]) -> int: # 求解原問題if len(nums) == 0: # 長度為 0,直接返回 0return 0maxlen = self.maxArray(nums, 0, len(nums)-1) # 開始將原問題劃分為子問題return maxlen # 返回解def maxArray(self, nums:List[int], l:int, r:int) -> int: # 遞歸求解子問題if l == r: # 遞歸終止條件return nums[l]mid = (l+r)//2 # 劃分三個子問題leftlen = self.maxArray(nums, l, mid) # 繼續(xù)劃分左子問題rightlen = self.maxArray(nums, mid+1, r) # 繼續(xù)劃分右子問題midlen = self.maxmidArray(nums, l, mid, r) # 求解子問題return max(leftlen, rightlen, midlen) # 返回子問題解def maxmidArray(self, nums:List[int], l:int, mid:int, r:int) -> int: # 求解子問題 middle代碼leftlen = -float('inf') # 包含中值 middle的左側(cè)最大值sum = 0for item in range(mid, l-1, -1):sum += nums[item]if sum > leftlen:leftlen = sumrightlen = -float('inf') # 不包含 middle的右側(cè)最大值sum = 0for item in range(mid+1, r+1):sum += nums[item]if sum > rightlen:rightlen = sumreturn leftlen+rightlen # 最終結(jié)果兩個值相加總結(jié)
以上是生活随笔為你收集整理的LeetCode53:最大子序和(分治思想,Python3实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LOLS11全球总决赛LNG首发阵容 L
- 下一篇: 114514是什么梗 114514含义出