Maximum Subarray

第一种方法,如果sum+val < val那么sum应该重新计算,sum = value

class Solution(object):
   def maxSubArray(self, nums):
       """
       :type nums: List[int]
       :rtype: int
       """
       maxn = nums[0]
       res = nums[0]
       for n in nums[1:]:
           if res + n < n:
               res = n
               maxn = max(maxn, res)
           else:
               res += n
               maxn = max(maxn, res)
       return maxn

这道题目给了我们一个array, 让我们找到一个连续的子数组,它的sum是最大的。题目说明有O(n) 方法和 Divide and conquer 方法。

我们先来看一下O(n) 方法:
    遍历array,对于每一个数字,我们判断,(之前的sum + 这个数字) 和 (这个数字) 比大小,如果(这个数字)自己就比 (之前的sum + 这个数字) 大的话,那么说明不需要再继续加了,直接从这个数字,开始继续,因为它自己已经比之前的sum都大了。
    反过来,如果 (之前的sum + 这个数字)大于 (这个数字)就继续加下去。

第二种方法Kadane Algorithm,如果之前的sum 小于0了,就重新计算sum,如果sum不小于0,那么继续加。
```
class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        maxn = nums[0]
        res = nums[0]
        for n in nums[1:]:
            if res < 0:
                res = n
                maxn = max(maxn, res)
            else:
                res += n
                maxn = max(maxn, res)
        return maxn
```
第三种方法 基于分治的方法:最大序列要么出现在左边,要么出现在右边,要么左右都有:
```
class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        res = self.sub(nums, 0, len(nums)-1)
        return res
    def sub(self, nums, left, right):
        if right - left == 0:
            return nums[left]
        middle = (left + right) / 2
        leftmax = self.sub(nums, left, middle)
        rightmax = self.sub(nums, middle + 1, right)
        leftright = 0
        right_m = 0
        left_m = nums[middle]
        for i in range(middle+1, right+1):
            leftright += nums[i]
            right_m = max(leftright, right_m)
        leftright =nums[middle]
        for i in range(middle-1,left - 1, -1):
            leftright += nums[i]
            left_m = max(leftright, left_m)
        res = max(leftmax, rightmax)
        return max(res, right_m + left_m)
```

你可能感兴趣的:(Maximum Subarray)