连续子数组的最大和---贪心+动态规划

输入一个整型数组,数组中的一个或者连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为O(n)。

示例:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]

输出:6

解释:连续子数组[4,-1,2,1] 的和最大,为6。

提示:

1<=nums.length<=10^5;

-100<=nums[i]<=100。

 

首先:求最值问题的,不是贪心策略(算法)就是动态规划

采取贪心策略,只要当前子段的和最大,就记录到maxSum中,如果sum的结果小于0,必须将sum重新置为0,即sum=0,然后重新开始计算新的子段和,因为加上负数只会更小。

nums = [-2,1,-3,4,-1,2,1,-5,4]

例如:初始化 sum=0; maxSum = nums[0]; 从第一个开始遍历。

sum = sum+nums[i]  第一个是-2,则sum=-2=maxSum。 

此时sum=-2,小于0,下一个数加上-2怎么也比原本的小,所以将sum置为0。

 public static void main(String[] args){
        Scanner sc= new Scanner(System.in);
        String strNums = sc.nextLine();
        String[] strNumArray = strNums.split(" ");
        int [] nums = new int[strNumArray.length];
        for(int i=0;i<strNumArray.length;i++){
            nums[i] = Integer.valueOf(strNumArray[i]);
        }
        int sum = 0;//将子数组和初始化为0
        //用来记录子数组最大的和,先初始化为第一个数组的值
        int maxSum = nums[0];
        for(int i= 0;i<nums.length;i++){
            //循环遍历数组中的每一个数
            sum = sum + nums[i];
            //如果子数组和大于最大和,则将子数组和赋值给最大和
            if(sum>=maxSum) maxSum = sum;
            //如果子数组和小于0,则置为0;因为任何数加一个负数,都比其本身小 
            if(sum<0) sum = 0;
        }
        System.out.println(maxSum);
    }

 

posted @ 2021-03-14 22:39  Gentleman-cx  阅读(146)  评论(0编辑  收藏  举报