题解 | #连续子数组的最大和(二)#
连续子数组的最大和(二)
https://www.nowcoder.com/practice/11662ff51a714bbd8de809a89c481e21
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @return int整型一维数组
*/
public int[] FindGreatestSumOfSubArray (int[] array) {
// 要定位出dp[]最大时 array[]对应的起始位置
//定义dp数组
int[] dp = new int[array.length];
//初始值
dp[0] = array[0];
//最大值 注意不是0
int result = array[0];
int left = 0,right = 0;
//记录最长区间
int resl = 0, resr = 0;
//遍历方式
for (int i = 1; i < array.length ; i++) {
//保证右边界每次循环+1 有可能起点一样但两个长短不一的数组最大值相同
right++;
//递归逻辑
dp[i] = Math.max(dp[i - 1] + array[i], array[i]);
//更新起点 起点肯定从array[i]比现=先前数组大的时候开始
//反向思考:如果起点左移一位 整个数组就缩小了 所以必然不会左移
if(dp[i - 1] + array[i]<array[i] ) {
left = i;
}
//保存最大值 有时候数组长度拉长 总和还是不变 要得出最长的数组
if (result < dp[i] || (dp[i] == result && (right - left )>(resr - resl))){
result = dp[i];
resl = left;
resr = right;
}
}
int[] res = new int [resr -resl +1];
for(int i = 0;i<=resr -resl;i++){
res[i] = array[i+resl];
}
return res;
}
}
查看10道真题和解析