给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
用的是动态规划的方法,仅与前一个状态有关。各个子问题的解都是对于当前状态的最优解。(这个题目求的是整个问题的最优解,所以需要各个子问题最优解的最优解。)
//最容易理解的就是这个,开辟新的n的空间。
class Solution {
public int maxSubArray(int[] nums) {
int[] c=new int [nums.length];
c[0]=nums[0];
int max=nums[0];
for(int i=1;i<nums.length;i++){
c[i]=Math.max(c[i-1]+nums[i],nums[i]);
if(max<c[i]){
max=c[i];
}
}
return max;
}
}
这是不用开辟新的空间,就用一个值来代表当前的状态。
class Solution {
public int maxSubArray(int[] nums) {
int sum=nums[0];
int c=nums[0];
for(int i=1;i<nums.length;i++){
//然后这里的sum是上一个状态的值,动态规划只和上个状态值有关,我们需要判断的就是上一个状态值加上当前状态值与不加进行比较,就是更新当前的状态值。
if(sum+nums[i]<nums[i]){
sum=nums[i];
}
else{
sum=sum+nums[i];
}
c=Math.max(sum,c);//这个就是当前的最大值
}
return c;
}
}