Given an integer array nums
, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
Example:
Input: [-2,1,-3,4,-1,2,1,-5,4], Output: 6 Explanation: [4,-1,2,1] has the largest sum = 6.
Follow up:
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
方法一:动态规划 计算出每个子集的值
public int maxSubArray(int[] nums) {
int[][] res = new int[nums.length][nums.length];
res[0][0] = nums[0];
int max = Integer.MIN_VALUE;
for(int i=0;i<nums.length;i++) {
for(int j=i;j<nums.length;j++) {
if(i==j) {
res[i][j] = nums[i];
}else if(i>j){
continue;
}
else{
res[i][j] = res[i][j-1]+nums[j];
}
max = Math.max(max, res[i][j]);
}
}
return max;
}
最后超时了。凉凉。
方法二:如何判断是1-n而不是0-n为最大值呢?判断 0所在的位置的数是否小于0 若小于0 则为1-n中的数
public int maxSubArray(int[] nums) {
int max =nums[0];
int subMax = nums[0];
for(int i=1;i<nums.length;i++) {
subMax = Math.max(subMax+nums[i], nums[i]);
max = Math.max(subMax, max);
}
return max;
}