Lintcode 42. Maximum Subarray II
阿新 • • 發佈:2018-11-27
42. Maximum Subarray II
Given an array of integers, find two non-overlapping subarrays which have the largest sum.
The number in each subarray should be contiguous.
Return the largest sum.
Example
For given [1, 3, -1, 2, -1, 2]
, the two subarrays are [1, 3]
[2, -1, 2]
or [1, 3, -1, 2]
and [2]
, they both have the largest sum 7
.
Challenge
Can you do it in time complexity O(n) ?
class Solution { public: /* * @param nums: A list of integers * @return: An integer denotes the sum of max two non-overlapping subarrays */ int maxTwoSubArrays(vector<int> &nums) { // write your code here int left[nums.size()];int right[nums.size()]; int leftMax = nums.at(0); int leftSum = nums.at(0); left[0]= nums.at(0); for(int i = 1;i<nums.size();i++){ if(leftSum<0) leftSum = 0; leftSum += nums.at(i); if(leftMax<leftSum) leftMax = leftSum; left[i] = leftMax; } int rightMax = nums.at(nums.size()-1); int rightSum = nums.at(nums.size()-1); right[nums.size()-1]=nums.at(nums.size()-1); for(int i = nums.size()-2;i>=0;i--){ if(rightSum<0) rightSum = 0; rightSum += nums.at(i); if(rightMax<rightSum) rightMax = rightSum; right[i]=rightMax; } int Max = left[0]+right[1]; for(int j = 1;j<nums.size()-1;j++){ if(Max < left[j]+right[j+1]) Max = left[j]+right[j+1]; } return Max; } };
剛開始用vector儲存left和right兩個陣列,發現不能在特定位置插入資料,故舍棄;
用空間換時間