zoukankan      html  css  js  c++  java
  • leetcode53. 最大子序和 🌟

    题目:

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

    示例:

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

      如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

    来源:力扣(LeetCode)

    解答:

    leetcode优秀方案(来自力扣答案统计页,没有明确作者是谁,可留言告知):

    class Solution:
        """
            作者:pandawakaka
            链接:https://leetcode-cn.com/problems/two-sum/solution/bao-li-qiu-jie-by-pandawakaka/
        """
        def maxSubArray(self, nums: List[int]) -> int:
            tmp = nums[0]
            max_ = tmp
            n = len(nums)
            for i in range(1,n):
                # 当当前序列加上此时的元素的值大于tmp的值,说明最大序列和可能出现在后续序列中,记录此时的最大值
                if tmp + nums[i]>nums[i]:
                    max_ = max(max_, tmp+nums[i])
                    tmp = tmp + nums[i]
                else:
                    #当tmp(当前和)小于下一个元素时,当前最长序列到此为止。以该元素为起点继续找最大子序列,
                    # 并记录此时的最大值
                    max_ = max(max_, tmp, tmp+nums[i], nums[i])
                    tmp = nums[i]
            return max_
    View Code
    class Solution:
        """
            作者:pandawakaka
            链接:https://leetcode-cn.com/problems/two-sum/solution/bao-li-qiu-jie-by-pandawakaka/
            
            分治法:它的最大子序和要么在左半边,要么在右半边,要么是穿过中间,对于左右边的序列,情况也是一样,因此可以用递归处理。
                   中间部分的则可以直接计算出来,时间复杂度应该是 O(nlogn)
        """
        def maxSubArray(self, nums: List[int]) -> int:
            n = len(nums)
            #递归终止条件
            if n == 1:
                return nums[0]
            else:
                #递归计算左半边最大子序和
                max_left = self.maxSubArray(nums[0:len(nums) // 2])
                #递归计算右半边最大子序和
                max_right = self.maxSubArray(nums[len(nums) // 2:len(nums)])
    
            #计算中间的最大子序和,从右到左计算左边的最大子序和,从左到右计算右边的最大子序和,再相加
            max_l = nums[len(nums) // 2 - 1]
            tmp = 0
            for i in range(len(nums) // 2 - 1, -1, -1):
                tmp += nums[i]
                max_l = max(tmp, max_l)
            max_r = nums[len(nums) // 2]
            tmp = 0
            for i in range(len(nums) // 2, len(nums)):
                tmp += nums[i]
                max_r = max(tmp, max_r)
            #返回三个中的最大值
            return max(max_right,max_left,max_l+max_r)
    View Code
    class Solution:
        """
            作者:jyd
            链接:https://leetcode-cn.com/problems/two-sum/solution/maximum-subarray-dong-tai-gui-hua-by-jyd/
            
            动态规划典型题:遍历数组,记录max(nums[i-1] + nums[i], nums[i])(含义为保留前面累加和与以当前元素为开始,哪种更优),
                         即判断后面subarray是否舍去前面的累计加和,并继续遍历下一元素。
                         最后return加和中最大值。
        """
    
        def maxSubArray(self, nums: List[int]) -> int:
            for i in range(1, len(nums)):
                nums[i] = max(nums[i - 1] + nums[i], nums[i])
            return max(nums)
    View Code
    class Solution:
        def maxSubArray(self, nums):
            max_sum = nums[0]
            for i in range(len(nums)):
                temp = 0
                for j in range(i, len(nums)):
                    temp += nums[j]
                    if temp > max_sum:
                        max_sum = temp
            return max_sum
    View Code
    class Solution:
        def maxSubArray(self, nums) -> int:
            maxSum, curSum = float('-inf'), 0
            for i in range(len(nums)):
                curSum += nums[i]
                if curSum > maxSum:
                    maxSum = curSum
                if curSum < 0:
                    curSum = 0
            return maxSum
    View Code
  • 相关阅读:
    [NOIP2018 提高组] 保卫王国
    CF 939F. Cutlet
    [USACO15JAN]Moovie Mooving G
    [NOIP2017 提高组] 宝藏
    花园
    [[清华集训2012]串珠子]
    帮助——状压
    R语言产生月末日期
    R for循环示例
    Spark scala String Array转为String
  • 原文地址:https://www.cnblogs.com/catyuang/p/11178734.html
Copyright © 2011-2022 走看看