题目描述:
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
实例描述:
解题思路:
首先,我们需要做的是将数组中的数遍历,在遍历的过程中,进行相加,找出相加过后最大的值,在这里需要注意的是,如果数组只有一个值,那么不管这个数是多少都需要返回这个数,当数组全是负数的时候,需要返回最大的那个负数;
首先是有错误的代码:
var maxSubArray = function(nums) {
if(nums.length===1) return nums
let maxNum=-100;
let num=0;
for(let i=0;i<nums.length;i++){
if(nums[i] < 0) i++
num =nums[i]
for(let j=i+1;j<=nums.length;j++){
num+= (j === nums.length ? 0 : nums[j])
maxNum=Math.max(maxNum,num)
}
}
return maxNum
};
它的问题在于,没有考虑到当数组全是负数的情况
正确代码:
var maxSubArray = function(nums) {
let n =nums[0];
let num=0;
for(const i of nums){
if(num > 0) num +=i
else num =i
n=Math.max(n,num)
}
return n
};
这个就非常的巧妙:
首先将n的初始值设定为数组的第一个值,解决了数组为1的时候出现的问题,其次定义了一个中间变量,这个变量的目的是当数组中出现正数的时候(前提是这个正数不是数组的最后一个数的时候),将这个正数与后续的值相加起来,判断此正数与后续的相加的数到底那个大,从而得到想要的结果