LeetCode # Array # Easy # 53. Maximum Subarray
求连续子数组的最大和,这道题是面试经典问题。《算法导论》中提供了分治的解法,但是DP解法是最快的, 能达到O(N)。
思路:若当前的和小于0,则应该抛弃当前的和,重新开始求和。有一些边界条件需要注意:
1.数组长度为1时,直接返回该值;
2.数组元素均为负数时,问题就变成了找数组的最大元素。需要判断后一个元素与前一个元素的大小,若后一个元素大,则赋值给sum。
1 class Solution { 2 public int maxSubArray(int[] nums) { 3 4 int[] dp= new int[nums.length ] ; 5 dp[0]=nums[0]; 6 int max_dp= nums[0]; 7 if(nums.length == 1){ //判断数组长度 8 return nums[0]; 9 }else{ 10 for (int i = 1; i <= nums.length-1; ++i) { 11 if(dp[i-1]<=0 ){ //若当前sum<0, 12 if(dp[i-1]<= nums[i]) {//若下一个值大于sum 13 dp[i]=nums[i]; 14 }else{ //否则,sum不变。 15 dp[i] = dp[i-1];} 16 } 17 else dp[i]=nums[i]+dp[i-1]; //否则,更新sum 18 if(dp[i]>max_dp) max_dp=dp[i]; 19 } 20 return max_dp; 21 } 22 } 23 }
参考:https://blog.csdn.net/qq_29108585/article/details/62428952。