给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
思路: 第一联想到的是使用动态规划
class Solution {
public int maxSubArray(int[] nums) {
if(nums.length==0){
return 0;
}
int[] maxSum = new int[nums.length];
int ans = nums[0];
maxSum[0] = nums[0];
for(int i=1;i<nums.length;i++){
if(nums[i]>=0){
maxSum[i]=maxSum[i-1]>=0?maxSum[i-1]+nums[i]:nums[i];
}else {
maxSum[i]=Math.max(nums[i],maxSum[i-1]+nums[i]);
}
ans = Math.max(ans,maxSum[i]);
}
return ans;
}
}
感觉自己写的不好,提交才打败了55%的人
效率更高的写法如下:
class Solution {
public int maxSubArray(int[] nums) {
int ans = nums[0];
int sum = 0;
for(int num: nums) {
if(sum > 0) {
sum += num;
} else {
sum = num;
}
ans = Math.max(ans, sum);
}
return ans;
}
}
动态规划优化方法:
class Solution {
public static int maxSubArray(int[] nums) {
int[] maxNums = new int[nums.length];
int max = nums[0];
maxNums[0] = nums[0];
for (int i = 1; i < nums.length; i++) {
int current = nums[i];
maxNums[i] = Math.max(maxNums[i - 1] + current, current);
max = Math.max(maxNums[i], max);
}
return max;
}
}