LeetCode No.53 最大子序和 java 贪心 动态规划 (1)

目录

  • 题目
  • 题解
    • 贪心算法
    • 动态规划(dp)
      • dp解法1
      • dp解法2
        • 答案代码
  • 总结


题目

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

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

示例2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [0]
输出:0

示例 4:

输入:nums = [-1]
输出:-1

示例 5:

输入:nums = [-100000]
输出:-100000

提示:
1 <= nums.length <= 3 * 104
-105 <= nums[i] <= 105

进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。

来源:力扣(LeetCode)
链接:LeetCode No.53 最大子序和


题解

本题有非常多的解法,我所知道的有:

  1. 最暴力的相比较法(把所有子序列列出来然后比较他们的求和值)
  2. 贪心算法
  3. 动态规划
  4. 分治算法

除了第一种方法,下面我们来分别研究每一种方法,本期我们来细说贪心算法和动态规划,明天我将补充上分治的写法。

贪心算法

贪心:在对问题求解时,总是做出在当前看来是最好的选择。而在这道题的体现中,贪心的核心思想是:当前所指元素以及之前的元素之和若小于0,则舍弃这一元素之前的所有数列。

这句话是什么意思呢?它是在说,我们从数组头开始遍历,走到一个元素时计算这个元素以及之前元素的和:
LeetCode No.53 最大子序和 java 贪心 动态规划 (1)_第1张图片
如果元素之和小于0,则舍弃这一段数组,从下一个元素再开始相加:
LeetCode No.53 最大子序和 java 贪心 动态规划 (1)_第2张图片
注意上述的 max = Math.max(-2, -2) 的意思是:max = Math.max(-2, -3 + 1),是当前子串之和之前的max值相比得出新的max值
接下来:

你可能感兴趣的:(LeetCode刷题,算法专栏,leetcode,动态规划,贪心算法,数据结构,java)