• 【LeetCode算法-53】Maximum Subarray


    Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.

    Example:

    Input: [-2,1,-3,4,-1,2,1,-5,4],
    Output: 6
    Explanation: [4,-1,2,1] has the largest sum = 6.

    翻译:

    给定一个整数组,找到相加之和最大的子数组,返回最大的和

    思路1:

    暴力循环不解释

    1.循环遍历一个值的和,找出最大的那个

    2.循环遍历两个相邻数的和,找出最大的那个

    3.循环遍历三个相邻数的和,找出最大的那个

    ...

    最后比较所有的最大和,得到最最大的那个

    代码

    class Solution {
        public int maxSubArray(int[] nums) {
            int sum = nums[0];
            int length = nums.length;
            for(int i = 1;i<=length;i++){
                int once = getOnce(nums,i);
                if(once>sum){
                    sum = once;
                }
            }
            return sum;
        }
        
        public int getOnce(int[] nums,int n){
            int max = nums[0];
            for(int i = 0;i<=(nums.length-n);i++){
                int add = 0;
                int nn = n;
                while(--nn >= 0){
                    add+=nums[i+nn];
                }
                if(add > max){
                    max = add;
                }
            }
            return max;
        }
    }

    跑起来没问题,但是提交后报错了!Time Limit Exceeded,就是运行超时了,因为循环了3遍,时间复杂度是N的3次方啊,所以抛弃

    百度得到解决办法

    思路2:

    原数组  [-2,1,-3,4,-1,2,1,-5,4]

    设置初始最大和为第一个数-2,从第二个数开始遍历

    这里有一个思维技巧,就是只循环一遍,得到每个以当前值结尾的数组的最大值,一开始我没想明白这一块,后来多想几遍也就明白了

    代码:

    class Solution {
        public int maxSubArray(int[] nums) {
            int sum = nums[0];
            int max = nums[0];
      
             for (int i = 1; i < nums.length; i++) {
                 System.out.print("当前值:"+nums[i]+"--当前值+前面的最大和:"+(sum + nums[i]));
                 sum = Math.max(nums[i], sum + nums[i]);
                 System.out.println("当前的最大和:"+sum);
                 max = Math.max(max, sum);
             }
             return max;
        }
    }

    为何要这样比较呢,因为对于当前值来说,有两种可能

    1.和前面的数组抱团

    2.自己单干

    如果自己单干比抱团还厉害,当然自己单干咯

    欢迎关注我的微信公众号:安卓圈

  • 相关阅读:
    GCD
    vue中前进刷新、后退缓存方案收集
    vue cli3 项目配置
    CSS 多行省略失效 (-webkit-box-orient 失效) Second Autoprefixer control comment was ignored. Autoprefixer applies control comment to whole block, not to next rules.
    vue 设置当前页背景色
    vue history模式下的微信支付,及微信支付授权目录的填写,处理URL未注册
    h5 audio播放问题,audio获取缓存进度条
    h5页面ios键盘弹出收起后页面底部留白问题
    vue项目中引入vant 使用rem布局问题
    vue history模式下的微信分享
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/10912870.html
Copyright © 2020-2023  润新知