最大子列和问题

给定N个整数的序列,求所有连续子列和中的最大值,若该值小于0,则返回0。

public class MaxSubSeqSum {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int k = scan.nextInt();
        int[] arr = new int[k];
        for(int i = 0; i < k; i++){
            arr[i] = scan.nextInt();
        }
        Solution s = new Solution();
       // int max = s.max1(arr);
       // int max = s.max2(arr);
        int max = s.max3(arr);
        System.out.println(max);
    }


}

class Solution{

    //方法1 复杂度:O(n^3)
    public int max1(int arr[]){
        int maxSum = 0;
        for (int i = 0; i < arr.length; i++){                      //i记录子列开始位置
            for (int j = i; j < arr.length;j++){                   //j记录子列结束位置
                int thisSum = 0;
                for (int k = i; k <= j; k ++){                     //遍历由i,j确定的子列,求子列和
                    thisSum += arr[k];
                    if (thisSum > maxSum){
                        maxSum = thisSum;
                    }
                }
            }
        }
        return maxSum;
    }

    //方法2 复杂度:O(n^2)
    public int max2(int[] arr){
        int maxSum = 0;
        for (int i = 0; i < arr.length;i++){
            int thisSum = 0;
            for (int j = i; j < arr.length;j++){                   //j每次都加1,只要在上次的子列和结果上加上第j个元素,就是此次子列和
                thisSum += arr[j];
                if (thisSum > maxSum){
                    maxSum = thisSum;
                }
            }
        }
        return maxSum;
    }

    //方法3 实时处理数据,读取一个数据,算一下子列和,复杂度:O(n)
    public int max3(int[] arr){
        int maxSum = 0;
        int thisSum = 0;

        for (int i = 0; i < arr.length; i++){ 
            thisSum += arr[i];
            if (thisSum < 0){
                thisSum = 0; //若当前子列和小于0就抛弃,因为它不会使后面的子列和增加
            }
            if (thisSum > maxSum){
                maxSum = thisSum;
            }
        }
        return maxSum;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值