• 最大子序和 —— 动态规划解法


    给定一个整数数组 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; }
  • 相关阅读:
    页面抛出的"Unable to validate data"错误
    oracle的sqlnet.ora,tnsnames.ora,listener.ora三个配置文件 water
    Win7下完全卸载Oracle 11g water
    抛出多个异常 water
    【转】有关Oracle随机字符串的生成方法及具体应用 water
    【转】oracle 中随机取一条记录的两种方法 water
    【转】Oracle索引列NULL值引发执行计划该表的测试示例 water
    Oracle 取随机数 water
    dbms_output.put_line长度限制问题 water
    oracle 监听启动、停止、查看命令 water
  • 原文地址:https://www.cnblogs.com/BulingBuling/p/11419384.html
Copyright © 2020-2023  润新知