剑指offer JZ30 连续子数组的最大和

38 篇文章 0 订阅
34 篇文章 0 订阅
本文介绍如何使用O(n)时间复杂度的动态规划方法求解整数数组中连续子数组的最大和问题。通过迭代过程,找到正数累加和大于0的最长子数组,确保在遇到负数时能快速重置累加和。关键代码展示了如何在遍历过程中保持最大和的更新。
摘要由CSDN通过智能技术生成

连续子数组的最大和

输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).
输入
[1,-2,3,10,-4,7,2,-5]
输出
18 (3,10,-4,7,2 )

public int FindGreatestSumOfSubArray(int[] array) {
         if (array.length==0 || array==null) {
             return 0;
         }
         int curSum=0;
         int greatestSum=array[0];
        //把数组分为前中后三段,中间段是满足要求的,那么前、后的总和一定是负
        //因此从前往后累加,如果累加结果为负了,那就从下一个开始重新累加
        //每一次累加之后都判断一下结果是否为最大的,把最大的保存下来,如果遇到一个负数使累加结果减少不会影响最大值
         for (int i = 0; i < array.length; i++) {
             if (curSum<=0) {
                 curSum=array[i]; //记录当前最大值
             }else {
                 curSum+=array[i]; //当array[i]为正数时,加上之前的最大值并更新最大值。
             }
             if (curSum>greatestSum) {
                 greatestSum=curSum; 
             }
         }
         return greatestSum;
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值