[leetcode]53. Maximum Subarray
阿新 • • 發佈:2018-12-08
被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;
}