LeetCode-探索-初级算法-动态规划-3. 最大子序和(个人做题记录,不是习题讲解)

LeetCode-探索-初级算法-动态规划-3. 最大子序和(个人做题记录,不是习题讲解)

LeetCode探索-初级算法:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/

  1. 最大子序和
  • 语言:java

  • 思路:试图用一次for循环做出来(动态规划的方式),然而失败了。

  • 参考代码1(1ms):用到的辅助空间小,如果当前得到的数组和 < 0,那么负数+负数肯定更小,直接当前最大和就是本身,如果原本数组和 > 0,则继续加上当前值,继续判断。

    https://blog.csdn.net/weixin_41876155/article/details/80036893

    class Solution {
             public int maxSubArray(int[] nums) {// 动态规划法
                 int sum=nums[0];
                 int n=nums[0];
                 for(int i=1;i<nums.length;i++) {
                     if(n>0)n+=nums[i];
                     else n=nums[i];
                     if(sum<n)sum=n;
                 }
                 return sum;
             }
         }
    
  • 参考代码2(1ms):每次子数组的和都是尽量取最大值,即当前+下一个和单纯下一个,哪个比较大就用哪一个当最大值。

    import java.lang.Math;
    class Solution {
        public int maxSubArray(int[] nums) {
            if(nums.length == 0){
                return 0;
            }
            int max = nums[0];
            int[] res = new int[nums.length];
            res[0] = nums[0];
            for(int i=1; i<nums.length; ++i){
                res[i] = Math.max(res[i-1] + nums[i], nums[i]);
                if(max < res[i]){
                    max = res[i];
                }
            }
            return max;
        }
    }
    
  • 参考后重写(1ms):

    class Solution {
        public int maxSubArray(int[] nums) {
            int sum = nums[0];//表示可能是最大和的连续子数组的和
            int max = nums[0];//最大和
            for(int i = 1; i < nums.length; ++i){
                if(sum > 0)
                    sum += nums[i];
                else
                    sum = nums[i];
                if(max < sum)
                    max = sum;
            }
            return max;
        }
    }
    
发布了60 篇原创文章 · 获赞 6 · 访问量 5525

猜你喜欢

转载自blog.csdn.net/Ashiamd/article/details/102473223
今日推荐