面试算法-求数组最大子序列和

1. 题目

有一个数组,如-2, 3, 6, 2, -4, 15, -8,查找其中最大子序列和。在本例中,最大值为3+6+2+-4+15=22,假设数组中必有正数.

2.思路

  1. 假设我们已知结果,和为最大的最大子序列为i到j之间
  2. 可以将i-1做为分界点,即该点之前的子序列和为负数,因为若该子序列不为负数则可于后续序列相加,与假设相悖
  3. 由思路1和2可进行操作:从数组由左至右相加,若为负数则可理解为到了分界点,不做计入,在分界点之后继续开始计算

3.上代码

package com.coline.algorithm.subarray;

/**
 * 算法:求数组最大子序列和
 *
 * @author Coline
 * 题目:有一个数组,如-2, 3, 6, 2, -4, 15, -8,查找其中最大子序列和。在本例中,最大值为3+6+2+-4+15=22,假设数组中必有正数.
 * 思路:
 * 1.假设我们已知结果,和为最大的最大子序列为i到j之间
 * 2.可以将i-1做为分界点,即该点之前的子序列和为负数,因为若该子序列不为负数则可于后续序列相加,与假设相悖
 * 3.由思路1和2可进行操作:从数组由左至右相加,若为负数则可理解为到了分界点,不做计入,在分界点之后继续开始计算
 */
public class MaxSumSubArray {
    static int maxSumSubArray(int[] array) {
        // 用于存放最大和
        int maxSum = 0;
        // 用于存放当前遍历子序列和
        int currentSum = 0;

        for (int value : array) {
            currentSum += value;
            // 若当前子序列和小于0则以此为分界点重新计算
            if (currentSum < 0) {
                currentSum = 0;
            } else {
                // 若当前子序列和大于记录的最大值则将currentSum赋值给maxSum
                if (currentSum > maxSum) {
                    maxSum = currentSum;
                }
            }
        }

        return maxSum;
    }

    public static void main(String[] arg0) {
        int[] array = {-2, 3, 6, 2, -4, 15, -8};

        System.out.println(maxSumSubArray(array));

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值