zoukankan      html  css  js  c++  java
  • 连续子数组的最大和---贪心+动态规划

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

    要求时间复杂度为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);
        }
    不忘初心,相信自己,坚持下去,付诸实施。
  • 相关阅读:
    第三章 操作符
    exit函数
    详解C++ friend关键字
    放假了,暂告一段落,迎接研究生
    使用const 提高函数的健壮性
    使用断言assert
    对return 语句的正确性和效率进行检查
    函数堆栈
    somethings about QSplitter
    引用和引用参数
  • 原文地址:https://www.cnblogs.com/controller666/p/14534678.html
Copyright © 2011-2022 走看看