zoukankan      html  css  js  c++  java
  • 53. 最大子序和

    给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

    示例:

    输入: [-2,1,-3,4,-1,2,1,-5,4],
    输出: 6
    解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
    //感想:这道题拿到手首先想到了很多东西,比如说动态规划,双指针,滑动窗口,感觉啥都像,又啥都不像,先是觉得动态规划应该可以,但是我TM的想歪了,我真是个睿智。。。。
    我觉得应该这么考虑:用一个二维数组来保存所有东西,也就是一个[n][n]这么大的数组,然后从1个元素开始往上填,先是找一个元素的最大值再找两个到三个。。。
    这样我觉得肯定没问题,应该是可以做出来的,但是这TM不就是暴力法吗?我饱了,我自己真TND下饭看,给自己看傻了。。。。
    不行就试试别的,然后是滑动窗口,仔细想想,感觉这东西还是暴力,感觉好像没什么区别,那就再想想其他的。。。
    又想到了买股票的有还是没有,当我沿着这条路走的时候,我发现,如果你昨天不要的话,然后保存的是个正数的话,你想用昨天的那个正数加上今天的这个正数,这TM的好像不对唉。。
    你昨天都不要了,你今天要了,那肯定就不连续了啊,我发现了一个多么吊的事实啊。。(哭晕)
    然后就是正确的解法了:
    对于每个元素,当我们遍历到的时候,我们必须要,如果这样的话,那么如果昨天的是正数,我们就可以直接加上了,如果是负数,那么昨天的我们就不要,只要今天的,我
    TM的好机智啊。总算是成功的写出来了,不容易啊。。。。
    下面是代码:如果有不明白的地方,欢迎交流进步。。。
     1 class Solution {
     2     public int maxSubArray(int[] nums) {
     3         if(nums==null||nums.length==0)
     4             return 0;
     5         int[] dp=new int[nums.length];
     6         dp[0]=nums[0];
     7         for(int i=1;i<nums.length;i++)
     8             dp[i]=Math.max(dp[i-1]+nums[i],nums[i]);
     9         int res=dp[0];
    10         for(int i=1;i<nums.length;i++)
    11             res=Math.max(res,dp[i]);
    12         return res;
    13     }
    14 }


  • 相关阅读:
    Python集合(set)类型的操作
    3GPP接口定义及相关协议一览
    OSS基本概念介绍
    建造者模式(Builder Pattern)
    组合模式(Composite Pattern)
    观察者模式(Observe Pattern)
    ReentrantLock
    <logger>和<root>
    logback的configuration
    logback的加载过程
  • 原文地址:https://www.cnblogs.com/cold-windy/p/11740811.html
Copyright © 2011-2022 走看看