使用的动态规划:
public int maxSubArray(int[] nums) {
if(nums.length == 1) return nums[0];
int ans = nums[0];//存储最大值
int tmp = nums[0];//存储某一个位置之前的最大值
for (int i = 1; i < nums.length; i++) {
tmp = Math.max(nums[i] + tmp,nums[i]);//如果tmp加上当前位置的数值,还没有当前位置的数值大,则更新tmp,重新划分起点
ans = Math.max(ans,tmp);//更新答案
}
return ans;
}
后来又仔细想了一下,如果要求返回数组的话,怎么求解,下面是自己想的代码,用的几个测试样例,都通过了。
public static int[] maxSubArray(int[] nums) {
if(nums.length == 1) return nums;
int ans = nums[0];//存储最大值
int tmp = nums[0];//存储某一个位置之前的最大值
int left = 0;
int right = 0;
for (int i = 1; i < nums.length; i++) {
// tmp = Math.max(nums[i] + tmp,nums[i]);
// ans = Math.max(ans,tmp);
if(nums[i] + tmp < nums[i]) {//此位置之前的最大值加上当前位置的数值 小于 当前位置的数值时,更新left的位置,并且重置tmp的值
left = i;
tmp = nums[i];
}else {
tmp = tmp + nums[i];
}
if(ans < tmp){//tmp大于存储的最大值,则更新right的位置,并且更新最大值
right = i;
ans =tmp;
}
}
return Arrays.copyOfRange(nums,left,right + 1);