最大子序列和

最大子序列是要找出由数组成的一维数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大;而 {5,-6,4,2}的最大子序列是{4,2},它的和是6。

找最大子序列的方法很简单,只要前i项的和还没有小于0那么子序列就一直向后扩展,否则丢弃之前的子序列开始新的子序列,同时我们要记下各个子序列的和,最后找到和最大的子序列。

package stringTest;

/**
 * 最大的子序列,就是指某一段的子序列的和最大,解决方案就是从左向右,判断子序列是否小于0,如果小于0 就从新开始找子序列,否则就开始考虑下一位
 * 
 * @author duola
 *
 */
public class maxSubSequence {

    private static int maxsub(int[] a) {
        if (a.length <= 0 || a == null)
            return -1;
        int maxsum = 0, sum1 = 0;
        for (int i = 0; i < a.length; i++) {
            sum1 += a[i];
            if (sum1 > maxsum) {
                maxsum = sum1;
            }
            if (sum1 < 0) {
                sum1 = 0;
            }
        }
        return maxsum;
    }

    public static void main(String[] args) {
        int[] a = { -2, 11, -4, 13, -5, -2 };
        int[] b = { -6, 2, 4, -7, 5, 3, 2, -1, 6, -9, 10, -2 };
        System.out.println(maxsub(a));  //20
        System.out.print(maxsub(b));    //16
    }

}

如果要求找到子序列开始和结束的元素,只需要找到最后一个大于等于0 的元素,然后用最大和从后向前减去即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值