leetcode刷题记录-53. 最大子数组和

122 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情

前言

今天的题目为简单,通过贪心的思维不断地去求当前最长子序列所需要的操作,不用去管下一项的值是什么,这就是贪心的思维所在。

每日一题

今天的题目是 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

题解

贪心算法

题目要求我们找到最大的子数组,通过贪心算法的思维,我们去循环遍历当前的数组,不用去关心下一个是什么,每次都会找到在当前遍历的情况下最大的值,比如遍历到当前位置,但是前面的和为负数,那么说明前面的数组只会减少和,那么就会放弃掉前面的所有数组。

我们用 [-2,1,-3,4,-1,2,1,-5,4] 结合图来实际看一下。

  1. 首先我们先去循环遍历数组,然后在一开始的时候初始化三个参数,一个是当前的子序列和,一个是之前的子序列和,还有一个是最大子序列和。

image.png

  1. 然后我们向后遍历,在下一项当中,我们就要去判断这一项之前项的和是否为负数,负数的话说明是可以抛弃的,就会抛弃掉之前的所有项,并且更新当前子序列和和最大子序列和。

image.png

  1. 然后指向下一项,把上一项的当前值作为下一项的之前和,更新当前值加上新的一项,然后和最大值做一个对比交换

image.png

  1. 一直重复上面步骤,知道数组遍历结束,就可以找到最长的子序列了。
/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function (nums) {
  let maxSum = nums[0];
  let oldSum = 0;
  let newSum = 0;
  for (let i = 0; i < nums.length; i++) {
    oldSum = newSum;
    if (oldSum < 0) {
      newSum = 0;
    }
    newSum = newSum + nums[i];
    maxSum = Math.max(newSum, maxSum);
  }
  return maxSum;
};

image.png