leetcode学习笔记(53.最大连续子序和)

119 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

本题考察数列相关知识,为中等题53.最大连续子序和

53.最大连续子序和

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

子数组 是数组中的一个连续部分。

 

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

示例 2:
输入:nums = [1]
输出:1

示例 3:
输入:nums = [5,4,-1,7,8]
输出:23

提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。

代码

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        n = len(nums)
        if n <= 1:
            return nums[0]
        sum = nums[0]
        result = nums[0]
        for i in range(1,n):#找到第i个数为止最大的和
            if sum >= 0 :
                sum += nums[i]
            else:
                sum = nums[i]
            if sum > result:#所有和里最大的
                result = sum
        return result
简化
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        size = len(nums) 
        if size < 1:
            return nums[0]
        pre = 0
        res = nums[0]
        for i in range(size):
            pre = max(nums[i], pre + nums[i])
            res = max(res, pre)
        return res

解析

算是用动态规划吧,根据上一步的信息进行下一步和的计算。
具体步骤:
1.如果数列长度只有1,则直接输出数列的第一个数即可
2.定义sum用来保存到目前为止选中数列的和,result表示选中数列之前的最大和
3.如果sum为正即对于下一个数有正向影响,即目前为止选定数列可以使数列变大应该保留,反之则意味着目前选定的数列有负面影响,不应该保留 4.如果sum的选的数组和大于目前为止的result,则更新result,否则保留原result 5.输出最后的result即可

来源:力扣(LeetCode)
题目链接:leetcode.cn/problems/ma…