zoukankan      html  css  js  c++  java
  • 最大子序和 —— 动态规划解法

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

    示例:

    输入: [-2,1,-3,4,-1,2,1,-5,4],
    输出: 6
    解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

    思路:

    我的思路就是正常从左往右走几遍就会发现他的规律

    定义两个值:一个当前的子序列的和 sum,一个最大和 max。

    设定初始的 sum = 0,max = num[0]。

    1 从 -2 开始,sum = -2 ,我们会发现,负数加上正数不会比这个正数大,所以 -2+1 < 1 。那么这个负数就没有存在的意义了,抛弃。

      → sum = -2,max = -2

    2 继续从 1 开始,sum = 1,1 + (-3) 看不出什么,我们把这个和记录下来,也就是 -2 ,是个负数。

      → sum = -2, max = -2

    3 继续往后 4,我们又回到了类似第 1 步的问题,后面这个数是正数,肯定从正数开始,和才会越来越大,所以,抛弃 -2, 选择4,sum = 4 。

      → sum = 4, max = 4

    4 继续往后-1,我们记录当前的和,但是这个和小于max,所以不更新max。

      → sum = 3,max = 4

    5 继续往后2,当前的和大于max,更新max。

      → sum = 5,max = 5

    6 继续往后1,同5

      → sum = 6,max = 6

    7 继续往后-5,同4

      → sum = 1,max = 6

    ..... 

    最后得出最大的子序列和为 6 。

    现在我们是不是发现了很多规律~

    注意:1 当只有一个数的时候,最大的就是这个数。

       2 如果序列里有大于0 的数,那么最大子序列的开头一定是大于0的数。

    我的代码:

        public static int maxSubArray(int[] nums) {
            int sum = 0;
            int ans = nums[0];
            for (int i = 0; i < nums.length; i++) {
           // 这个的意思也就是sum + nums[i] > nums[i],也就是sum > 0
    if (sum > 0) { sum += nums[i]; } else { sum = nums[i]; }
           // 如果当前sum更大,则更新
    if (sum >= ans) { ans = sum; } } return ans; }
  • 相关阅读:
    Confluence 6 删除垃圾内容
    Confluence 6 在 Apache 或者系统级别阻止垃圾
    Confluence 6 避免和清理垃圾
    Confluence 6 配置 简易信息聚合(RSS)
    Confluence 6 匿名访问远程 API
    Confluence 6 使用电子邮件可见
    Confluence 6 配置 XSRF 保护
    Confluence 6 为登录失败编辑,禁用和配置验证码
    Confluence 6 为登录失败配置使用验证码
    Confluence 6 为搜索引擎隐藏外部链接
  • 原文地址:https://www.cnblogs.com/BulingBuling/p/11419384.html
Copyright © 2011-2022 走看看