1. 程式人生 > >53. Maximum Subarray的C++演算法

53. Maximum Subarray的C++演算法

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;
	}
};