题解 | #连续子数组的最大和(二)#
连续子数组的最大和(二)
http://www.nowcoder.com/practice/11662ff51a714bbd8de809a89c481e21
思路
- 遍历数组
- 找最大连续子数组
-
- 即在前一个资产为负时,抛弃前面资产,重新求资;
-
- 若前一个资产为正时,继续求资。
- 循环过程中记录左右节点位置,当资产没有变小且长度变大时,更新最大左右节点位置
代码
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @return int整型一维数组
*/
/**
* 找连续子数组的最大和
* 同时,记录left和right左右节点的位置
*/
function FindGreatestSumOfSubArray( array ) {
// write code here
// 先处理特殊情况,数组长度为1
if(array.length==1)
return array;
// 初始化定义左右节点的位置
// 注意,同时声明两个变量,要分开分别赋值
var left=0,right=0;
// 初始化定义,最大左右节点的位置
var lposmax=0,rposmax=0;
// 初始化定义前几个的和为第一个元素值
var dp=[];
dp[0]=array[0];
// 初始化定义最大和为dp[0]
var maxsum=dp[0];
// 从第二个元素开始循环遍历
for(let i=1;i<array.length;i++){
right++;
// 转移矩阵,最大和
dp[i]=Math.max(dp[i-1]+array[i],array[i])
// 如果资产dp为负值,则舍弃掉dp,位置更新,区间新起点
if(dp[i-1]<0)
left=right;
// 若出现以下两种情况,需更新左右位置和最大值
// ①出现更大的dp
// ②在dp没变化或者变大的情况下,目前长度也变长了
// 为什么第2种情况有问题呢?明明符合条件呀,maxsum未变但长度变大,要更新的
if(dp[i]>maxsum || dp[i]==maxsum && (right-left)>(rposmax-lposmax)){
lposmax=left;
rposmax=right;
maxsum=dp[i]
}
}
// 数组裁剪
console.log(lposmax)
console.log(rposmax)
return array.slice(lposmax,rposmax+1);
}
module.exports = {
FindGreatestSumOfSubArray : FindGreatestSumOfSubArray
};