Leetcode53--最大子序和(图解分析,附剑指offer图书资料)

Leetcode53–最大子序和

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

编程语言:python

作者:黑暗主宰

邮箱:shengzhanhe@gmail.com

Leetcode53–最大子序和

题目描述

原题链接:

​ https://leetcode-cn.com/problems/maximum-subarray/ (中文)

​ https://leetcode.com/problems/maximum-subarray/ (英文)

题目描述:

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

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

解题思路

该题对应《剑指offer》第二版:面试题42,(第一版:面试题31)想要这两本书的小伙伴,可以给我发邮件,或者在评论区留下自己的邮箱

方法1:暴力求解

对于该题,我刚开始用的是暴力求解的方法,因为是求最大的连续子序列,可以从下标为0的元素开始,记录从下标0开始的序列中最大值,然后再从下标1开始循环,一直到下标n-1。使用暴力求解的话,时间复杂度为 O ( n 2 ) O(n^2) O(n2)

下面是暴力循环的方法(注:该方法提交不能AC):

def maxSubArray(nums):
	maxNum = min(nums)
	tmp = 0
        
	for i in range(len(nums)):
		tmp = 0
		for j in range(i, len(nums)):
			tmp += nums[j]
			if maxNum <= tmp:
				maxNum = tmp
            
	return maxNum

方法2:动态规划

使用动态规划的解法,时间复杂度可以降低为 O ( n ) O(n) O(n)

假如我们现在有一个序列 nums=[-2, 3, -1, 1, -3],要计算这个序列的最大子序列。假设 sum = 0,加上第一个元素后 sum = -2,目前-2是最大的数,接着我们加上第二个元素3,我们会发现加上以后 sum = 1 ,现在的最大数应该是3,所以我们应该舍弃-2,直接令 sum = 3。简单的数就是正数增益,当 sum <= 0的时候,就舍弃前面所有的元素,从当前元素开始相加,并记录相加过程中最大的值。为了更好的说明,使用一个图1解释一下(剑指off使用的是表格解释,说的也相当的详细)。
在这里插入图片描述
相信看着这个图,就更清晰了吧,这个图是leetcode 上一位大佬画的,详细请点开参考链接1

下面是动态规划方法的代码:

def maxSubArray(nums):
	sum = 0
	max = nums[0]
        
	for index in range(len(nums)):
		if sum < 0:
			sum = 0        
		sum += nums[index]
		if sum > max:
			max = sum
	return max

欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
在这里插入图片描述

注: 文中有写错的地方,欢迎大家不吝指正!!!


  1. https://leetcode-cn.com/problems/maximum-subarray/solution/hua-jie-suan-fa-53-zui-da-zi-xu-he-by-guanpengchn ↩︎

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值