【劍指Offer】30.連續子數組的最大和

題目描述

輸入一個整型數組,數組裏有正數也有負數。數組中有一個或連續的多個正數組成一個子數組。求所有子數組的和的最大值。要求時間複雜度爲O(n)

例如輸入的數組爲{1,-2,3,10,-4,7,2,-5},和最大的子數組爲{3,10,-4,7,2},輸出爲該子數組的和18

解題思路

解法一:暴力求解

枚舉出數組的所有子數組並求出他們的和

長度爲n的數組,總共有n(n+1)/2個子數組的和,最快也需要O(n^2)

解法二:舉例分析數組的規律

試着從頭到尾逐個累加示例數組中的每個數字。初始化和爲0。第一步加上第一個數字1,此時和爲1。第二步加上數字-2,和就變成了-1。第三步加上數字3,注意到此前累計的和是-1,小於0,那如果用-1加上3,得到的和是2,比3本身還小。第一個數字開始的子數組的和會小於會第三個數字開始的子數組的和。不用考慮從第一個數字開始的子數組,之前累計的和也被拋棄。

從第三個數字重新開始累加,得到的和是3,第四步加10,得到和爲13 。第五步加上-4,和爲9,發現由於-4是一個負數,因此累加-4之後得到的和比原來的和還要小。因此我們要把之前得到的和13保存下來,有可能是最大的子數組的和。第六步加上數字7,9加7的結果是16,比之前最大的和13還要打,把最大的子數組的和由13更新爲16。第七步加上2,累加得到的和爲18,同時我們也要更新最大子數組的和。第八步加上最後一個數字-5,由於得到的和爲13,小於此前最大的和18,因此最終最大的子數組的和爲18,對應的子數組是{3,10,-4,7,2}

# -*- coding:utf-8 -*-
class Solution:
    def FindGreatestSumOfSubArray(self, array):
        # write code here
        max_sum, cur_sum = -0xffffff, 0
        for i in array:
            if cur_sum <= 0:
                cur_sum = i
            else:
                cur_sum += i
            if cur_sum > max_sum:
                max_sum = cur_sum
        return max_sum

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章