剑指offer 面试题31 连续子数组的最大和

剑指offer 面试题31 连续子数组的最大和

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

package algorithm.foroffer.top40;

import java.util.Arrays;

/**
 * Created by liyazhou on 2017/5/29.
 * 面试题31:连续子数组的最大和
 *
 * 题目:
 *      输入一个整型数组,数组里有正数也有负数。数组中一个或者连续的多个整数组成一个子数组。
 *      求所有子数组的和的最大值。要求时间复杂度是 O(n)。
 *
 * 考查点:
 *      1. 动态规划
 *         函数 f(i) 表示以第 i 个数字结尾的子数组的最大和
 *
 * 思路:
 *      1. 连续子数组的最大和 maxSum 的初始值是数组的首元素,
 *         当前元素之前的资产 currSum 的初始值是数组的首元素
 *      2. 遍历[1,n)区间的数组元素,
 *             如果资产 currSum 小于0,是负资产,抛弃,设置 currSum = 0
 *             当前元素之前的资产 currSum 累加当前元素的值,结果为新的资产
 *             如果新的资产大于最大资产,则更新最大资源值为新的资产值
 */

public class Test31 {

    public static int findMaxSumOfSubArray(int[] array){
        if (array == null) throw new RuntimeException("Invalid input. Array is null.");

        int maxSum = array[0];
        int currSum = array[0];

        for (int i = 1; i < array.length; i ++){
            // 当前元素之前的若干元素的和 currSum, if currSum < 0,表示其是负资产,不参与下一轮的计算
            if (currSum < 0) currSum = 0;
            currSum += array[i];
            if (maxSum < currSum) maxSum = currSum;   // max = max > currSum ? max : currSum;
        }

        return maxSum;
    }


    public static void main(String[] args){
        int[][] arrays = {
                {1, -2, 3, 10, -4, 7, 2, -15},
                {5, -1, -3, -4, -7, -2, -15},
                {-5, 1, -3, -4, -7, -2, -15},
        };

        for (int i = 0; i < arrays.length; i++){
            System.out.print(Arrays.toString(arrays[i]) + ":\t");
            System.out.println(findMaxSumOfSubArray(arrays[i]));
        }
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值