53. Maximum Subarray的C++演算法
阿新 • • 發佈:2018-11-11
1.暴力迴圈,以每一個數字為起點尋找最大子陣列。時間複雜度為O(n^2)
2.分治法。一個數組從中間分開,有三種情況:
A.最大陣列在左邊,對左半邊陣列再次使用分治演算法。
B.最大陣列在右邊,對右半邊陣列再次使用分治演算法。
C.最大陣列橫跨左邊和右邊,從中間位置向左向右找到最大值。
三種方法進行比較即可。
class Solution { public: int maxSubArray(vector<int> &nums) { int res = findmax(nums, 0, nums.size()-1); return res; } int findmax(vector<int> &nums, int head, int tail) { if (head == tail) return nums[head]; else{ int mid = (head + tail) / 2; return max(max(findmax(nums, head, mid), findmax(nums, mid+1, tail)), findmid(nums, mid)); } } int findmid(vector<int> &nums, int mid){ int max1 = nums[mid]; int sum = nums[mid]; for (int i = mid - 1; i >= 0; i--) { sum = sum + nums[i]; if (sum > max1) max1 = sum; } int max2 = nums[mid]; sum = nums[mid]; for (int i = mid + 1; i <nums.size(); i++) { sum = sum + nums[i]; if (sum > max2) max2 = sum; } return max1 + max2 - nums[mid]; } };
3.動態規劃。動態規劃, 原陣列為nums[],設dp[i] 是以nums[i]結尾的子陣列的最大和,對於元素nums[i+1], 它有兩種選擇:a、vec[i+1]接著前面的子陣列構成最大和,b、nums[i+1]自己單獨構成子陣列。則dp[i+1] = max{dp[i]+nums[i+1], nums[i+1]}。
class Solution { public: int maxSubArray(vector<int> &nums) { vector<int> dp(nums.size(),0); dp[0] = nums[0]; int res = dp[0]; for (int i = 1; i < nums.size(); i++) { dp[i] = max(dp[i - 1] + nums[i], nums[i]); if (dp[i]>res) res = dp[i]; } return res; } };