zoukankan      html  css  js  c++  java
  • LeetCode--053--最大子序和

    问题描述:

    给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

    示例:

    输入: [-2,1,-3,4,-1,2,1,-5,4],
    输出: 6
    解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
    

    时间超限:  暴力穷举

     1 class Solution(object):
     2     def maxSubArray(self, nums):
     3         """
     4         :type nums: List[int]
     5         :rtype: int
     6         """
     7         
     8         max = nums[0]
     9         if len(nums) == 1:
    10             return nums[0]
    11         res = 0
    12         for step in range(len(nums)):#step 控制连续加的个数
    13             for i in range(len(nums)-step):#i控制从第几个开始加
    14                 for j in range(step+1):
    15                     res += nums[i]
    16                     i += 1
    17                 if res > max:
    18                     max = res
    19                 res = 0
    20         return max

    方法1:当前值的大小与前面的值之和比较,若当前值更大,则取当前值,舍弃前面的值之和

     1 class Solution(object):
     2     def maxSubArray(self, nums):
     3         """
     4         :type nums: List[int]
     5         :rtype: int
     6         """
     7         if len(nums) == 0:
     8             return 0
     9         preSum = maxSum = nums[0]
    10         for i in xrange(1, len(nums)):
    11             preSum = max(preSum + nums[i], nums[i])
    12             maxSum = max(maxSum, preSum)
    13         return maxSum

    方法2:(分治法)对半分,求左边最大,右边最大,以及边界最大 ,返回最大值

     1 class Solution(object):
     2     def maxSubArray(self, nums):
     3         """
     4         :type nums: List[int]
     5         :rtype: int
     6         """
     7         def maxSum(alist, left, right):
     8             #递归返回条件
     9             if left >= right:
    10                 return alist[left]  #return原值,不是return 0
    11                 
    12             middle = (left + right) // 2 #记得打括号,去(TiMe)调了老半天
    13             leftMax = maxSum(alist, left, middle)
    14             rightMax = maxSum(alist, middle+1, right)
    15             
    16             #求左边界最大值
    17             leftBoardSum, leftBoardMax = 0, alist[middle]
    18             for i in range(middle, left-1,-1): #左段最右端没有取到middle
    19                 leftBoardSum += alist[i]
    20                 if leftBoardSum > leftBoardMax:
    21                     leftBoardMax = leftBoardSum
    22                     
    23             #求右边界最大值
    24             rightBoardSum, rightBoardMax = 0, alist[middle+1]
    25             for j in range(middle+1, right+1): #右段最右端取到了right
    26                 rightBoardSum += alist[j]
    27                 if rightBoardSum > rightBoardMax:
    28                     rightBoardMax = rightBoardSum
    29                     
    30             #边界最大值
    31             boardMax = leftBoardMax + rightBoardMax
    32 
    33             return max(leftMax, rightMax, boardMax)
    34             
    35             
    36         if nums == []:
    37             return 0
    38         
    39         left = 0
    40         right = len(nums)-1
    41         res = maxSum(nums, left, right)   #left,right为左右下标
    42         return res

    2018-07-24 11:11:59

  • 相关阅读:
    回归,随缘写一些python心得吧
    划分树【有些东西,其实自己还不太会也要忍住把*装完】
    [codevs3273]两圆的交 计算几何
    10-12考试整理
    10-7考试整理
    [codevs1163]访问艺术馆
    [codevs2640]打印页数
    9-28 解题报告
    [CODEVS3323]时空跳跃者的封锁
    [codevs2442] kshort 经典题
  • 原文地址:https://www.cnblogs.com/NPC-assange/p/9358896.html
Copyright © 2011-2022 走看看