给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
- 输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
- 输出:6
- 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
- 输入:nums = [1]
- 输出:1
示例 3:
- 输入:nums = [5,4,-1,7,8]
- 输出:23
提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
来源:力扣(LeetCode)
通过本质看问题
贪心本质:通过 局部最优 肯定能得到 全局最优。
应题目要求:
- 连续子数组
- 子数组的最大和
由常理以及数学知识可知:只有负数才会递减。
由贪心本质可知可知: 每次保证连续子数组总和不存在负数情况(局部最优解),就可以得到最大值(最优解)。
↑ 通俗解释:当前子数组 为 <0 , 则再与下一个数求和 也必定递减,所以直接重新开始算了;
- 例子:-1 -2 3 一开始子数组 {-1} 总和已经是负数 直接重新开始 ,以-2为头,则子数组{-2} 也是负数 又重新开始 ,以3开头 则子数组{3} 总和最大。答案为3.
PS:在此过程中每一个步骤中 都需要不停比较结果 选取最大值。因为不是遍历的最后一个结果才是最大的。
时间复杂度 O(N) 空间复杂度(O1)
此题是贪心入门题必刷题,利于开阔我们的贪心思维 能够为后面的变型题打下基础
class Solution {
public int maxSubArray(int[] nums) {
int sum = 0, res = 0;
for (int num : nums) {
if (sum < 0) {
sum = num;
}
else{
sum += num;
}
res = Math.max(res, sum); //每轮都要选取最大值。
}
return res;
}
}
进阶:你能使用动态规划解决此题吗?
一题多解 ! 必须熟知的动态规划解法:点我进入~