首页 > 编程语言 > 详细

JZ30 连续子数组的最大和

时间:2021-08-22 21:23:01      阅读:17      评论:0      收藏:0      [点我收藏+]

原题链接


描述

输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n)。


示例1

输入:[1,-2,3,10,-4,7,2,-5]
返回值:18
说明:输入的数组为{1,-2,3,10,—4,7,2,一5},和最大的子数组为{3,10,一4,7,2},因此输出为该子数组的和 18。 

思路

动态规划。新建和array等长的dp数组,用于存放以array[i] 结尾的所有子序列的和的最大值,初始状态就是dp[0]=array[0]。对于以 array[i+1] 的结尾的子序列,如果要取最大值有两种情况:dp[i] >0 和dp[i]<=0,第一种情况说明前面的子序列和是大于 0 的,所以array[i+1] 结尾的子序列的最大和应该是 dp[i]+array[i+1],否则最大和就是array[i+1]自己。由于全程只使用到 i 和 i + 1两个位置的最大值进行判断,所以不要构建一个和array等长的数组,只要使用一个变量存储 dp[i] 就可以了。


解答

public int FindGreatestSumOfSubArray(int[] array) {
    int res = array[0];
    int pre = array[0];
    for (int i = 0; i < array.length; i++) {
        pre = pre > 0 ? array[i] + pre : array[i];
        res = Math.max(pre, res);
    }
    return res;
}

JZ30 连续子数组的最大和

原文:https://www.cnblogs.com/klaus08/p/15172823.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!