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。

猜你喜欢

转载自www.cnblogs.com/DongPingAn/p/8982138.html