classSolution{public:intmaxSubArray(vector<int>&nums){//因为只需要知道dp的前一项,我们用int代替一维数组intdp(nums[0]);int result = dp;for(int i =1; i < nums.size(); i++){
dp =max(dp + nums[i], nums[i]);
result =max(result, dp);}return result;}};
执行用时
内存消耗
8 ms
9.4 MB
贪心
classSolution{public:intmaxSubArray(vector<int>&nums){//类似寻找最大最小值的题目,初始值一定要定义成理论上的最小最大值int result = INT_MIN;int numsSize =int(nums.size());int sum =0;for(int i =0; i < numsSize; i++){
sum += nums[i];
result =max(result, sum);//如果sum < 0,重新开始找子序串if(sum <0){
sum =0;}}return result;}};
执行用时
内存消耗
8 ms
9.4 MB
分治法
classSolution{public:intmaxSubArray(vector<int>&nums){//类似寻找最大最小值的题目,初始值一定要定义成理论上的最小最大值int result = INT_MIN;int numsSize =int(nums.size());
result =maxSubArrayHelper(nums,0, numsSize -1);return result;}intmaxSubArrayHelper(vector<int>&nums,int left,int right){if(left == right){return nums[left];}int mid =(left + right)/2;int leftSum =maxSubArrayHelper(nums, left, mid);//注意这里应是mid + 1,否则left + 1 = right时,会无线循环int rightSum =maxSubArrayHelper(nums, mid +1, right);int midSum =findMaxCrossingSubarray(nums, left, mid, right);int result =max(leftSum, rightSum);
result =max(result, midSum);return result;}intfindMaxCrossingSubarray(vector<int>&nums,int left,int mid,int right){int leftSum = INT_MIN;int sum =0;for(int i = mid; i >= left; i--){
sum += nums[i];
leftSum =max(leftSum, sum);}int rightSum = INT_MIN;
sum =0;//注意这里i = mid + 1,避免重复用到nums[i]for(int i = mid +1; i <= right; i++){
sum += nums[i];
rightSum =max(rightSum, sum);}return(leftSum + rightSum);}};