Interview100-3 最大子数组问题

题目

输入一个整型数组,其中有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都一个和。求所有子数组中和最大为多少(最优解的值),最大的子数组为什么(最优解)。要求时间复杂度为: O(n)。

例如:输入的数组为:[1, -2, 3, 10, -4, 7, 2, -5],则和最大的子数组为:[3, 10, -4, 7, 2],和为18。

解法

1. 首先最大子数组问题为《算法导论》中的一个示例算法。在其中使用的为分治策略进行实现的。该分治方法的时间复杂为:O(nlgn)( T(n) = 2T(n/2) + O(n) 主方法可求解)。

2. 第二种方式:考虑一种思路,如果当前值(有可能是第一个,或者是当前元素与之前元素组成子数组的和)为正值,那么它继续加后面的数,总会增加子数组的值。而如果当前为负值,则无论它后面的元素为正还是负,它本身都会减少和的值。基于这种思想,如果当前的和值为负值,我们应该将其清0,重新累加。这样最终的值就是最大子数组的值。同时使用start和end两个指针标记具有最大和的子数组的开始和结束的位置,这种实现方式只对数组遍历一遍,因此时间复杂度为:O(n)。伪代码如下:

FIND-MAX-SUBARRAY(int[] array):
    int start = 0, end = 0;
    int curSum = 0, maxSum = 0;
    int k = 0;

    for i = 0 to array.length
        curSum += array[i];
        if curSum < 0
            curSum = 0;
            k = i+1;
        if curSum > maxSum
            maxSum = curSum;
            start = k;
            end = i;

    if curSum == 0 // 数组中的元素全为负值,则只需要找到数组中的最大元素即可
        maxSum = array[0];
        for i = 1 to array.length
            if array[i] > maxSum
                maxSum = array[i];
                start = end = i;
    return maxSum, start, end;

现在我们看一下《算法导论》中的分治方法的实现:(待添加)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值