最大连续子串

问题描述:

给定一个由数字组成的数组,求出和最大的子数组

求解方法:

1.暴力法

选取所有连续和的可能性,O(n^2)

2.分析法

当遍历到第i个元素时,判断在它前面的连续子序列和是否大于0,如果大于0,则以位置i结尾的最大连续子序列和为元素i和前门的连续子序列和相加;否则,则以位置i结尾的最大连续子序列和为元素i。

3.动态规划

记s[i]是以a[i]结尾的最大子数组和

s[i+1]=max(s[i]+a[i+1],a[i+1])

s[0]=a[0];

遍历数组a[i]即可得到以每一项结尾的最大子数组和s[i],求出其中最大值

 

package offer_0831;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class MaxSerialSubList {
    // 暴力法 - func1 - 略
    
    // 分析法
    Integer func2(List<Integer> nums) {
        int maxRes = 0;
        int resBefore = 0;
        for (Integer i : nums) {
            if (resBefore < 0) {
                resBefore = i;
            } else {
                resBefore = i + resBefore;
                maxRes = maxRes > resBefore ? maxRes : resBefore;
            }
        }
        return maxRes;
    }

    // 动态规划
    Integer func3(List<Integer> nums) {
        List<Integer> res = new LinkedList<Integer>();
        res.add(nums.get(0));
        for(int i = 1;i< nums.size();i++){
            res.set(i,res.get(i-1)+nums.get(i)>0?res.get(i-1)+nums.get(i):nums.get(i));
        }
        return  Collections.max(res);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值