//本题用动态规划解决 /*和求最长子序列和一样,可以看一下我上一篇文章,仅仅对子序列的长度做了记录 设置 right ,left ,maxRight ,maxLeft 分别记录实时左右长度和最长的长度 */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param array int整型一维数组 * @return int整型一维数组 */ public int[] FindGreatestSumOfSubArray (int[] array) { //当array长度为1时直接返回 if(array.length==1){ return array; } //记录以array【i】元素结尾的子序列的和的最大值 int[] dp = new int[array.length]; int left =0,right = 0; int maxLeft = 0 ,maxRight = 0; //初始化dp dp[0] = array[0]; //记录最大子和 int max = dp[0]; for (int i = 1; i < array.length; i++) { //每次运行右边长度默认加一 right++; //因为是连续的子序列,所以当前子序列的和必然和前一个元素的子序列和有关 dp[i] = Math.max(dp[i - 1] + array[i], array[i]); //状态转移:连续子数组和最大值 //当前子序列和更新为array【i】时,前一个子序列结束,重新更新长度 //(!注意!)当dp【i-1】== 0时,左右长度不归零更新 if(dp[i - 1] + array[i] < array[i]) left = right; //题目要的是最长长度,并且是最大的子和 if (max < dp[i] || max == dp[i] && (maxRight - maxLeft +1) <(right - left + 1) ){ max = dp[i]; maxLeft = left; maxRight = right; } } int[] ints = new int[maxRight - maxLeft + 1 ]; for (int j = maxLeft; j <= maxRight ; j++) { ints[j - maxLeft] = array[j]; } return ints; } }