题目
给定一个整数数组 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
代码
最开始想用滑动窗口,发现while的条件太难写了。
class Solution {
public int maxSubArray(int[] nums) {
int left=0;
int right=0;
int sum=0;
int max=0;
while(right<nums.length)
{
sum+=nums[right];
System.out.println("right: "+right+"left: "+left+"sum:"+sum);
while(left<right&&nums[left]<0)
{
sum-=nums[left];
left++;
System.out.println("right: "+right+"left: "+left+"sum:"+sum);
}
max=Math.max(max,sum);
right++;
}
return max;
}
}
看啦题解才意识到求最值——动态规划、贪心等算法。这里使用了动态规划的算法,这里是属于连续的,则子问题中的dp[i]是包含以nums[i]为结尾的最大连续和,因此最终的结果不一定是dp[n],而且,传递函数的话,dp[i]可以有dp[i-1]+nums[i]得到,也可以由nums[i]从而实现“断”
public int maxSubArray(int[] nums) {
if(nums==null)
return 0;
int[]dp=new int[nums.length];
dp[0]=nums[0];
int max=Integer.MIN_VALUE;
max=Math.max(max,dp[0]);
for(int i=1;i<nums.length;i++)
{
dp[i]=Math.max(dp[i-1]+nums[i],nums[i]);
max=Math.max(max,dp[i]);
}
return max;
}