开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第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 = [5,4,-1,7,8]
输出:23
- 提示:
1 <= nums.length <= 105-104 <= nums[i] <= 104- 进阶: 如果你已经实现复杂度为
O(n)的解法,尝试使用更为精妙的 分治法 求解。
解析
这道题看了下官网的解决方案,第一种是给了动态规划的方式,第二种是分治,这里就只说一下对动态规划方案的理解,后续再尝试使用分治来解决。
根据动态规划的思路,可以把状态定义、状态转移方程、初始化、输出、空间优化都列举出来进行解析。
主要分为以下几个步骤:
- 首先遍历数组,设置两个变量值,最大连续子序列和为 sum和结果result
- 如果sum>0,表示sum符合我们的要求,能够使结果增大,就可以保留该值并加上当前遍历的值
- 如果 sum <= 0,表示sum符合我们的要求,直接舍弃,sum更改为当前遍历的值
- 比较sum和result的值大小,取最大值设置为result
- 遍历完成,返回result
class Solution {
public int maxSubArray(int[] nums) {
int result = nums[0];
int sum = 0;
for(int num: nums) {
if(sum > 0) {
sum += num;
} else {
sum = num;
}
result = Math.max(result, sum);
}
return result;
}
}
复杂度:
- 时间复杂度:O(n),n表示数组的长度
- 空间复杂度:O(1)。只需要常数空间存放若干变量
运行结果:
执行结果:通过
执行用时:1 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:50.4 MB, 在所有 Java 提交中击败了79.45%的用户