Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [−2,1,−3,4,−1,2,1,−5,4]
,
the contiguous subarray [4,−1,2,1]
has the largest sum = 6
.
这道题就是求最大子串和
肯定是o(n)的时间和o(1)的空间
就是每次相加, 1、先判断是否全是非正数,如果是,那么直接返回最大的那个数。
2、然后每次加一个数,就这样依次加下去,如果nums[j]大于0,那么与result相比取大的。
2、如果此时的和小于0,那么舍去,并且将i置于此时j的下一位。
public class Solution {
public int maxSubArray(int[] nums) {
if( nums.length == 1)
return nums[0];
int result = nums[0],ans = nums[0];
int i = 0,j = 1;
for( int k = 0;k<nums.length;k++ ){
if( result < nums[k])
result = nums[k];
}
if( result <= 0 )
return result;
while( i<nums.length && j < nums.length ){
if( nums[i] < 0 ){
while( i<nums.length && nums[i]<0 )
i++;
if( i<nums.length )
ans = nums[i];
j = i+1;
}
else if( nums[j] >= 0 ){
ans+=nums[j];
j++;
result = result>ans?result:ans;
}else{
if( ans+nums[j] <= 0 ){
i = j+1;
j = j+2;
if( i<nums.length )
ans = nums[i];
}else{
ans+=nums[j];
j++;
}
}
}
return result;
}
}
然后发现是在写的是啰嗦。其实如下就可以
public class Solution {
public int maxSubArray(int[] nums) {
int max=nums[0];
for(int i=1;i<nums.length;++i){
nums[i]=nums[i-1]<0 ? nums[i] : nums[i-1]+nums[i];
max = Math.max(max, nums[i]);
}
return max;
}
}
public class Solution {
public int maxSubArray(int[] nums) {
if (nums.length == 1)
return nums[0];
int preSum = nums[0];
int max = nums[0];
for (int i = 1; i < nums.length; i++) {
if (preSum <= 0)
preSum = nums[i];
else {
preSum += nums[i];
}
if (preSum > max)
max = preSum;
}
return max;
}
}