首页 > 其他 > 详细

leetcode每日一题(2021.5.13)——最大子序扣

时间:2021-05-14 09:50:33      阅读:21      评论:0      收藏:0      [点我收藏+]

题目:最大子序扣(简单)

一、问题描述

  给定一个整数数组 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)——最大子序扣

原文:https://www.cnblogs.com/zyq79434/p/14766505.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!