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)——最大子序扣的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode每日一题(3)

LeetCode每日一题

LeetCode2022 7月 每日一题

LeetCode2022 7月 每日一题

LeetCode9月 每日一题

LeetCode9月 每日一题