题解 | #连续子数组的最大和(二)#

连续子数组的最大和(二)

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;
    }
}

全部评论

相关推荐

05-09 14:45
门头沟学院 Java
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-01 13:13
ecece:这么明目张胆虚报就业率啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务