携手创作,共同成长!这是我参与「掘金日新计划 · 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…