其他分享
首页 > 其他分享> > 力扣53.最大子数和

力扣53.最大子数和

作者:互联网

三种情况:

  1.左半部分(leftsum)最大(与右边不连续,不一定包括mid)

  2.右半部分(rightsum)最大(与左边不连续,不一定包括mid+1)

  3.左右部分联合最大(左右两边连续,包括mid)

  1和2是前面返回的(与另一边不连续 !!!,左半部分不一定是包含mid 以mid结尾的,右半部分也不一定包含mid+1,从mid+1开始的),我们只要求左右联合部分的最大值,在这三者里取最大值

  

 1 class Solution {
 2 public:
 3     int maxSubArray(vector<int>& nums) {
 4        return MaxSum(nums,0,nums.size() - 1);
 5     }
 6 
 7 private:
 8     int MaxSum(vector<int>& nums,int l,int r){
 9         if(l == r)  return nums[l];
10         int mid = (l + r) >> 1;
11         int leftsum = MaxSum(nums,l,mid);
12         int rightsum = MaxSum(nums,mid + 1,r);
13         int lhalf = -10001,lcount = 0;
14         for(int i = mid;i >= l;i --){
15             lcount += nums[i];
16             if(lcount > lhalf) //贪心
17               lhalf = lcount;
18         }
19         int rhalf = -10001,rcount = 0;
20         for(int i = mid + 1;i <= r;i ++){
21             rcount += nums[i];
22             if(rcount > rhalf) //贪心
23               rhalf = rcount;
24         }
25         return max(max(leftsum,rightsum),lhalf + rhalf);
26     }
27 };

 

---------------分割线---------------

其他解法

动态规划

pre:x 和 pre + x(x之前的最大子数和 + x),两者取较大值    <==>   dp[i] = max(nums[i],dp[i - 1] + nums[i]),其中nums[i]相当于前面的x

res:我们要求的最大子数和,pre每更新一次,res也要和它比较更新一次,保证res是所有子数和里的最大值

 1 class Solution {
 2 public:
 3     int maxSubArray(vector<int>& nums) 
 4     {
 5       int pre = 0;
 6       int res = nums[0];
 7       for(const auto& x : nums){
 8           pre = max(x,pre + x);
 9           res = max(res,pre);
10       }
11       return res;
12     }
13 };

 

标签:pre,子数,nums,int,res,mid,53,力扣,max
来源: https://www.cnblogs.com/balabalabubalabala/p/16539762.html