【Leet Code】53. Maximum Subarray---Medium
来源:互联网 发布:有淘宝号怎么开店 编辑:程序博客网 时间:2024/06/05 18:29
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [−2,1,−3,4,−1,2,1,−5,4]
,
the contiguous subarray [4,−1,2,1]
has the largest sum = 6
.
click to show more practice.
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
思路一:
遍历数组元素,每次加一个新的元素,如果当前和sum>之前保存的结果result,令result=sum;如果sum<0,令sum=0.最后result保存的就是最大的和值。
思路二:
就是实现题目中说到的divide and conquer approach。
1)将数组从mid分成left、right两部分,迭代找到leftMax和rightMax。令subMax=max(leftMax,rightMax)
2)然后是找mid连接的左右两边的元素的最大值。
先找mid左边的和最大值leftContigousMax(一定要包含nums[mid],不然不是连续的和了),如果leftContigousMax就可以直接返回subMax了(因为这时可以肯定右边的最大值rightMax是最大的)。
同理,找到mid右边的和最大值rightContigousMax,如果rightContigousMax<0,直接返回subMax;
否则返回max(subMax,leftContigousMax+rightContigousMax)。
代码实现一:
class Solution {public: int maxSubArray(vector<int>& nums) { if(nums.size() < 1) return 0; int result = INT_MIN; int sum = 0; for(auto num: nums) { sum += num; if(sum > result) result = sum; if(sum < 0) sum = 0; } return result; }};
代码2实现:
class Solution {public: int maxSubArray(vector<int>& nums) { return maxSubArrayRec(nums, 0, nums.size() -1); }private:int maxSubArrayRec(vector<int>&nums, int i, int j) { if(i==j) return nums[i]; int mid = (i + j) / 2; int leftMax = maxSubArrayRec(nums,i,mid); int rightMax = maxSubArrayRec(nums,mid+1,j); int subMax = max(leftMax,rightMax); int leftContiguousMax = nums[mid]; int leftSum = nums[mid]; for(int k=mid-1; k>=i; k--) { leftSum += nums[k]; if(leftSum > leftContiguousMax) leftContiguousMax = leftSum; } if(leftContiguousMax <= 0) return subMax; int rightContigousMax = nums[mid+1]; int rightSum = nums[mid+1]; for(int k=mid+2; k<=j; k++) { rightSum += nums[k]; if(rightSum > rightContigousMax) rightContigousMax = rightSum; } if(rightContigousMax <= 0) return subMax; return max(subMax,leftContiguousMax+rightContigousMax);}};
- 【Leet Code】53. Maximum Subarray---Medium
- 【Leet Code】152. Maximum Product Subarray---Medium
- 【LEET-CODE】53. Maximum Subarray
- [leet code] Maximum Subarray
- 53. Maximum Subarray #Medium
- 【Leet Code】209. Minimum Size Subarray Sum---Medium
- 【LeetCode】53. Maximum Subarray (Medium)
- (Leetcode)53. Maximum Subarray(medium)
- Leetcode 53. Maximum Subarray (Medium) (cpp)
- 53. Maximum Subarray 难度:medium 类别:分治
- LeetCode解题报告 53. Maximum Subarray [medium]
- Leetcode 53. Maximum Subarray (Medium) (java)
- [Medium]Maximum Subarray
- [Medium]Maximum Product Subarray
- Leet code Maximum Gap
- Medium 53题 Maximum Subarray
- 152. Maximum Product Subarray -Medium
- 152. Maximum Product Subarray Medium
- SSH:Struts2框架(Ognl表达式的讲解和使用说明)
- CMake学习--1
- COM
- 335x uboot 看门狗喂狗
- UIImageView 序列帧动画及内存优化详解
- 【Leet Code】53. Maximum Subarray---Medium
- 棋牌游戏开发之斗地主算法点选牌
- BAT及各大互联网公司2014前端笔试面试题:JavaScript篇
- go 遍历目录 --在原文上改的,原文在那找不到了
- 贝叶斯定理简析
- Oracle维护数据完整性——约束
- 怎么让tableview的section的headerView随着cell一起滑动
- QUT:E-Board
- 推送消息的appdelegate