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

  • 相关阅读:
    springboot 启动报错"No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' available"
    使用SpringCloud Stream结合rabbitMQ实现消息消费失败重发机制
    Java 继承
    Java 抽象类 抽象方法 使用说明
    java 构造器(构造方法)使用详细说明
    Java enum枚举在实际项目中的常用方法
    万字长文!一次性弄懂 Nginx 处理 HTTP 请求的 11 个阶段
    Nginx 如何自定义变量?
    听说你的资源被盗用了,那你知道 Nginx 怎么防盗链吗?
    Nginx 的变量究竟是怎么一回事?
  • 原文地址:https://www.cnblogs.com/NPC-assange/p/9358896.html
Copyright © 2011-2022 走看看