持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情
力扣100——最大子数组的和
题目
今天的力扣100题,我们来刷一下求最大子数组的和
。我们来看一下题目:给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。题目要求我们使用O(n)
的时间复杂度来求解,这是一道经常在面试当中出现的题目,接下来我们就来解决一下。
思路
这是一道数组题,题目要求我们在一个数组当中,找到和最大的子序列,这道题我们可以使用动态规划的方法来做,我们先假设给定数组的第一元素为最大的子序列的和,
我们接下来需要将第一个元素作为基准,和其他的元素进行比较。然后我们还需要定义一个变量max
来存储当前最大子序列的和,之后我们只需要返回当前最大之序列的和即可。
我们通过循环的方式来遍历数组当中的每个元素,将元素从头开始相加,如果相加后的元素小于当前元素,那么则表示最大子序列不在前面的元素当中,而在当前元素往后。
解法
/**
* @param {number[]} nums
* @return {number}
*/
var maxSubArray = function(nums) {
// 创建一个变量来保存子序列的和
// 初始化为数组的第一个元素
let sum = nums[0];
// 用来存储当前最大子序列的和
// 初始换为数组的第一个元素
let max = nums[0];
for(let i = 1;i<nums.length;i++){
// 将循环的元素与之前的子序列和加起来,然后与当前元素一起进行比较,由此来判断之前子序列的和加上当前元素是增加还是减少
// 如果之前子序列的和加上当前元素比当前元素小,那么就表示最大子序列应该从当前元素算起,反之,则从之前的子序列加上当前元素
sum = Math.max(sum + nums[i],nums[i]);
// 比较下当前子序列的和和之前最大子序列和的大小
if(sum > max){
// 如果当前子序列的和大于保持的最大子序列和,那么将当前子序列和赋值给Max
max = sum;
}
}
return max;
};