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


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

    要求时间复杂度为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);
        }
    不忘初心,相信自己,坚持下去,付诸实施。
  • 相关阅读:
    基于IDEA+Maven+SpringMVC的入门web程序分析(一)
    Spring之路----chapter03 高级装配
    Spring之路---chapter02装配Bean
    Spring之路----Chapter01 Spring之旅
    实用网址-项目的创建、Idea打开Maven项目、Idea打开Eclipse项目
    Git之路-2017年9月8日14:37:01
    Redis入门指南-笔记-进阶
    DenyHosts 阻止SSH暴力攻击
    某cms最新版前台RCE漏洞(无需任何权限)2020-03-15
    通过Joomla的两次RCE漏洞看session反序列化
  • 原文地址:https://www.cnblogs.com/controller666/p/14534678.html
Copyright © 2020-2023  润新知