力扣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