被44题虐了,先跳个easy缓一缓。easy题就是easy题啊
Solution 1:自己的思路,但是单独处理了全负数的情况
class Solution {
public int maxSubArray(int[] nums) {
int i=0;
int sum=0;
int max=0;
int flag=0;
//处理全为负数的情况
for(int j=0;j<nums.length;j++){
if(nums[j]>=0){
flag=1;
break;
}
}
if(flag==0) {
Arrays.sort(nums);
return nums[nums.length-1];
}
while(i<nums.length){
if(sum+nums[i]<0){//只要加完小于0,那么sum归0,从头开始
sum=0;
}
else{//否则,无论正数,负数都加上去再说
sum+=nums[i];
if(sum>=max){
max=sum;
}
}
i++;
}
return max;
}
}
Solution 2:
从solution2-4,其实都是一个本质的思想
class Solution {
public int maxSubArray(int[] nums) {
int i=1;
int sum=nums[0];
int max=nums[0];
while(i<nums.length){
if(sum+nums[i]<nums[i]){
sum=nums[i];
}
else{
sum+=nums[i];
}
max=Math.max(sum,max);
i++;
}
return max;
}
}
Solution 3: 2的精简版
public int maxSubArray(int[] nums) {
if(nums.length == 0) {
return 0;
}
int curMax = nums[0];
int allMax = nums[0];
for(int i = 1; i < nums.length; i++) {
curMax = Math.max(nums[i], curMax + nums[i]);
allMax = Math.max(allMax, curMax);
}
return allMax;
}
Solution 4: dp
public int maxSubArray(int[] A) {
int n = A.length;
int[] dp = new int[n];//dp[i] means the maximum subarray ending with A[i];
dp[0] = A[0];
int max = dp[0];
for(int i = 1; i < n; i++){
dp[i] = A[i] + (dp[i - 1] > 0 ? dp[i - 1] : 0);
max = Math.max(max, dp[i]);
}
return max;
}