53. 最大子序和
給定乙個整數陣列 nums ,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。
示例:輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。
高階:如果你已經實現複雜度為 o(n) 的解法,嘗試使用更為精妙的分治法求解。
python solution 1:
class solution(object):
def maxsubarray(self, nums):
""":type nums: list[int]
:rtype: int
"""if not nums:
return 0
cursum = maxsum = nums[0]
for num in nums[1:]:
cursum = max(num, cursum + num)
maxsum = max(cursum, maxsum)
return maxsum
分析:
在這種方法中,cursum既是指標又是結果的儲存器:如果num之前的連續 k 項之和比 num 小,那麼 cursum 充當指標,它會指向當前的 num;反之,它會儲存包括 num 在內的連續 k+1 項之和:
cursum = max(num, cursum + num)
這一行**之所以能夠保證是連續的 k 項之和,就在於它起到了指標的作用:如果 cursum 移動了,那麼求和子串行就會從 num 處重新開始累加,從而保證了子串行的連續性(不會跳過當前的數而去和後面的數相加);如果指標沒有移動,那麼它會儲存連續的 k+1 項之和。
cursum 的作用是負責遍歷 nums 中所有可能的求和情況,它並不能保證在遍歷完 nums 後 cursum 中儲存的就是最大的子序和,因為在它找到最大子序和後,如果此時 nums 還沒有遍歷完,那它就要繼續遍歷 nums,從而有可能導致這個最大的子序和被別的數字代替。因此程式中又用到了 maxsum 這個儲存器,其目的就是為了將 cursum 找到的那個最大的子序和儲存下來。
python solution 2:
class solution(object):
def maxsubarray(self, nums):
""":type nums: list[int]
:rtype: int
"""for i in range(1, len(nums)):
if nums[i-1] > 0:
nums[i] += nums[i-1]
return max(nums)
分析:
這個方法是基於這樣一種思想:任給乙個數字 m,假如我們想讓這個數字變大,現在讓它加上另外乙個數 n,那麼當 n 滿足什麼條件時 m 才會變大呢?顯然,只有當 n 是乙個正數的時候 m 才會變大。
現在假如給定乙個序列nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
,我們想要從中找到最大連續子序和,考慮從序列中的第乙個元素開始,乙個乙個進行判斷。判斷的標準是這樣的:
如果前面乙個數為正數,那就讓後面緊鄰的那個數加上前面的這個數,並讓二者之和替換掉後面緊鄰的這個數;
否則,什麼都不做。
按照這個原則,最終 nums 將變成:nums = [-2, 1, -2, 4, 3, 5, 6, 1, 5]
,從而此時的 max(nums) 就是要找的最大連續子序和。
53 最大子序和
給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。兩個變數,乙個是ans,用來儲存 更新子串行 乙個maxn,始終儲存著當前最大的子串行。子串行...
53 最大子序和
題目 給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6。思路 因為要考慮連續,所以需注意兩點,與當前比較的必定包含當前節點的上乙個節點,前n個節點...
53 最大子序和
給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。package le...