【数据结构与算法】面试题1:求最大子序列和

面试题描述

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

解法一:普通累加算法

为了求解数组的最大子序列和问题,我们需要 thisSum(用于保存当前子序列和,并做一下相关的比较) 和 maxSum (用于记录目前为止的最大子序列和)协同完成,

代码如下:

public class ArrayIsNullOrEmptyException extends RuntimeException{
    public ArrayIsNullOrEmptyException(){}
    public ArrayIsNullOrEmptyException(String mess){
        super(mess);
    }
}
/**
 * @author java6b
 * @deprecated  求解数组最大子序列和
 */
public class MaxSubSum {
    /**
     * 普通累加算法
     * @param array
     * @return
     */
    public static int FindGreatestSumOfSubArray(int[] array) {
        if (array == null || array.length == 0) {
            throw new ArrayIsNullOrEmptyException("数组不能为空!至少保证有一个元素");
        }
        int thisSum = array[0];
        int maxSum = array[0];
        for (int i=1;i<array.length;i++){
            if (thisSum < 0) {
                thisSum = array[i];
            } else {
                thisSum += array[i];
            }
            if (thisSum > maxSum) {
                maxSum = thisSum ;
            }
        }
        return maxSum;
    }
    
    public static void main(String[] args){
        int[] data1 = {-1,-5,-3,-49,5,6,4,9,-60,54,-34,65,3};
        int[] data2 = {-10,-5,-3,-49,-60};
        int[] data3 = {-1,-5,-3,1,-49,-60,-34,-65,-6};
        
        System.out.println(FindGreatestSumOfSubArray(data1));
        System.out.println(FindGreatestSumOfSubArray1(data2));
        System.out.println(FindGreatestSumOfSubArray1(data3));
    }
}

\qquad

解法二:动态规划

赋初值以后,如果从当前数组第二个开始,每次只取当前和数组位置的累加和与当前数组值中最大的那个
最大和数值每次再取自身与当前数组和最大的一个。
最后返回最大和。


/**
 * @author java6b
 * @deprecated  求解数组最大子序列和
 */
public class MaxSubSum {
    /**
     * 动态规划
     * @param array
     * @return
     */
    public static int FindGreatestSumOfSubArray1(int[] array) {
        if (array == null || array.length == 0) {
            throw new ArrayIsNullOrEmptyException("数组不能为空!至少保证有一个元素");
        }
        int thisSum  = array[0];
        int maxSum = array[0];
        for (int i=1;i<array.length;i++){
            thisSum  = Math.max(thisSum +array[i],array[i]);
            maxSum = Math.max(thisSum ,maxSum);
        }
        return maxSum;
    }
    
    public static void main(String[] args){
        int[] data1 = {-1,-5,-3,-49,5,6,4,9,-60,54,-34,65,3};
        int[] data2 = {-10,-5,-3,-49,-60};
        int[] data3 = {-1,-5,-3,1,-49,-60,-34,-65,-6};
        
        System.out.println(FindGreatestSumOfSubArray(data1));
        System.out.println(FindGreatestSumOfSubArray1(data2));
        System.out.println(FindGreatestSumOfSubArray1(data3));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值