leetcode每日一题(2021.5.13)——最大子序扣
Posted 似梦半醒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode每日一题(2021.5.13)——最大子序扣相关的知识,希望对你有一定的参考价值。
题目:最大子序扣(简单)
一、问题描述
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
二、思路解析
解法一:暴力求解,一个含n个元素的数组最多有n+(n-1)+(n-2)+....+2+1个连续子数组(包括该数组本身),所以把所有的可能求出来最后就能找出符合要求的值。
先定义一个存放最大和的变量max
采用双指针循环遍历数组,并不断更新max的值。
遍历过程中的求和可以通过一个循环完成
如图,i为慢指针,j为快指针,则总是需要计算i和j之间所有元素的和可通过 while(i <= j)实现对i和j之间元素的求和
代码时间复杂度太高,可以计算小数组,但是对大数组无能为力,所以需要更优的解法。
解法二:快慢指针法:
变量:慢指针slow,快指针fast,要返回的最大值max,一个flag用于保存子序和
要实现这个算法肯定需要对flag做一系列判定才行;
所以要总结flag的变化情况
1、flag为负,但是值增加:说明当前num[fast]前的子序和是负数,则抛弃fast前的子序,更新slow = fast 且重置flag的值 flag=num[slow] ;
2、flag为负,值在减小,当前遍历到的是个负数,只更新flag不更新max
3、flag为正,值增大,更新max
4、flag为正,值减小,不更新max
代码太长了所以截图中有重复部分,关于算法步骤还有一些下次,很多案例没有想到。明天有时间我会更新步骤
四、总结
该题难度很大,因为限制了时间复杂度,所以值得收藏,具体解法可以参考leetcode中的解法,比我的要好。
以上是关于leetcode每日一题(2021.5.13)——最大子序扣的主要内容,如果未能解决你的问题,请参考以下文章