剑指Offer—编程题31(连续子数组的最大和)

来源:互联网 发布:数据光端机 编辑:程序博客网 时间:2024/05/01 23:29

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


例子说明:

例如输入的数组为{1, -2, 3, 10, -4, 7, 2, -5},和最大的子数组为{3, 10, -4, 7, 2}。因此输出为该子数组的和18 。

解题思路:

解法一:举例分析数组的规律。

我们试着从头到尾逐个累加示例数组中的每个数字。初始化和为0。第一步加上第一个数字1, 此时和为1。接下来第二步加上数字-2,和就变成了-1。第三步刷上数字3。我们注意到由于此前累计的和是-1 ,小于0,那如果用-1 加上3 ,得到的和是2 , 比3 本身还小。也就是说从第一个数字开始的子数组的和会小于从第三个数字开始的子数组的和。因此我们不用考虑从第一个数字开始的子数组,之前累计的和也被抛弃。

我们从第三个数字重新开始累加,此时得到的和是3 。接下来第四步加10,得到和为13 。第五步加上-4, 和为9。我们发现由于-4 是一个负数,因此累加-4 之后得到的和比原来的和还要小。因此我们要把之前得到的和13 保存下来,它有可能是最大的子数组的和。第六步加上数字.7,9 加7 的结果是16,此时和比之前最大的和13 还要大, 把最大的子数组的和由13更新为16。第七步加上2,累加得到的和为18,同时我们也要更新最大子数组的和。第八步加上最后一个数字-5,由于得到的和为13 ,小于此前最大的和18,因此最终最大的子数组的和为18 ,对应的子数组是{3, 10, -4, 7, 2}。

代码实现:

public class Test31 {    /**     * 题目2 输入一个整型数组,数组里有正数也有负数。数组中一个或连     * 续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。     *     * @param arr 输入数组     * @return 最大的连续子数组和     */    public static int findGreatestSumOfSubArray(int[] arr) {        // 参数校验        if (arr == null || arr.length < 1) {            throw new IllegalArgumentException("Array must contain an element");        }        // 记录最大的子数组和,开始时是最小的整数        int max = Integer.MIN_VALUE;        // 当前的和        int curMax = 0;        // 数组遍历        for (int i : arr) {            // 如果当前和小于等于0,就重新设置当前和            if (curMax <= 0) {                curMax = i;            }            // 如果当前和大于0,累加当前和            else {                curMax += i;            }            // 更新记录到的最在的子数组和            if (max < curMax) {                max = curMax;            }        }        return max;    }    public static void main(String[] args) {        int[] data = {1, -2, 3, 10, -4, 7, 2, -5};        int[] data2 = {-2, -8, -1, -5, -9};        int[] data3 = {2, 8, 1, 5, 9};        System.out.println(findGreatestSumOfSubArray(data));        System.out.println(findGreatestSumOfSubArray(data2));        System.out.println(findGreatestSumOfSubArray(data3));    }}

运行结果:

这里写图片描述



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 顾客老嫌瓷砖贵怎么办 公司的公章丢了怎么办 物业不给充电费怎么办 怎么办社保卡去哪里办 单位没给社保卡怎么办 诈骗链接点开了怎么办 私人老板拖欠工资不给怎么办 辞职了工资不发怎么办 老板欠工资不给怎么办 投资平台跑路了怎么办 眼镜太松往下滑怎么办 塑胶水管管断了怎么办 淘宝排名靠后了怎么办 我有古董想出售怎么办 被拍卖公司骗了怎么办 苹果4s铃声太小怎么办 新号码注册微信怎么办 uc不能下种子了怎么办 刚出生的小牛喘怎么办 回奶之后有硬块怎么办 回奶第十天硬块怎么办 断奶期间乳房有硬块怎么办 断奶后乳房有肿块怎么办 北京一证通到期怎么办 没做过后勤的人怎么办 别样app被税了怎么办 人肉代购被税了怎么办 网易考拉被税了怎么办 家住乐清被税了怎么办 糖耐结果高了怎么办 35岁之后死档案怎么办 档案被自己拆了怎么办 超过35岁的死档怎么办 医保卡和社保卡怎么办 吴江市民卡丢了怎么办 小人领导整你该怎么办 哥特王朝3死了怎么办 索尼z3无限重启怎么办 三星s7用久了卡怎么办 手机进了一点水怎么办 淘宝登不上去了怎么办