持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情
今天,我们继续搞算法。
题目描述
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
题目分析
这个题目我们之前做过,之前用的是最大前缀来解决的,两个两个考虑的,这回我们整体考虑用动态规划,那怎么来考虑呢?我们需要把问题分解为:连续子数组和加上找最大,要知道第i个数组中的数连续,我们得知道第i-1个数选了啥对吧,如果nums[i-1]它的数是负数,那加上nums[i],它一定小于nums[i],所以,我们就在他们两个取最大,就是我们要的这个当前子序列和,如果这个数没有nums[i]大,说明不连续了,因此,我们就要nums[i]即可,然后我们把这个子序列遍历,取一个最大就是最大子序列和了。
同时我们还要注意两个事,一个就是答案的边界,我一开始ans取了一个最小,比如-1,但是我们是在和里面取最大,但是如果数组里只有一个比ans还小的数,答案应该就不对了,所以ans得是数组里面的第一个数,还有就是无论第一个数如何,我们都是要的,因此f[0]也给了第一个数。
代码如下:
class Solution {
public int maxSubArray(int[] nums) {
int m = nums.length;
int f[] = new int[m];
f[0] = nums[0];
for(int i=1;i<nums.length;i++){
f[i]=Math.max(nums[i]+f[i-1],nums[i]);
}
int ans = f[0];
for(int i =0;i<m;i++){
ans =Math.max(ans,f[i]);
}
return ans;
}
}