一起养成写作习惯!这是我参与「掘金日新计划 · 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] 结合图来实际看一下。
- 首先我们先去循环遍历数组,然后在一开始的时候初始化三个参数,一个是当前的子序列和,一个是之前的子序列和,还有一个是最大子序列和。
- 然后我们向后遍历,在下一项当中,我们就要去判断这一项之前项的和是否为负数,负数的话说明是可以抛弃的,就会抛弃掉之前的所有项,并且更新当前子序列和和最大子序列和。
- 然后指向下一项,把上一项的当前值作为下一项的之前和,更新当前值加上新的一项,然后和最大值做一个对比交换
- 一直重复上面步骤,知道数组遍历结束,就可以找到最长的子序列了。
/**
* @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;
};