标签:
分治算法
在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范式。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
分治法所能解决的问题一般具有以下几个特征:
分治法的三个步骤是:
以leetcode中Maximum Subarray为例:
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。
思路:利用分治法,最大连续子序列要么在数组的左半边,要么在数组的右半边,要么经过数组的中点。
int maxSubArray(vector<int>& nums) { if(nums.size() == 1)//递归退出 { return nums[0]; } auto mid =nums.begin() + (nums.end() - nums.begin())/2; vector<int> left_vec(nums.begin(),mid); int left = maxSubArray(left_vec);//要么在数组的左边 vector<int> right_vec(mid,nums.end());//要么在数组的右边 int right = maxSubArray(right_vec); //以下计算通过数组中间的情况,分别计算left_max和right_max,相加得到mid_max int left_max = -1000000; int left_add = 0; for(auto iter = mid-1;iter != nums.begin();iter--) { left_add += *iter; if(left_add > left_max) { left_max = left_add; } } left_add += *nums.begin(); if(left_add > left_max) { left_max = left_add; } int right_max = -1000000; int right_add = 0; for(auto iter = mid;iter != nums.end();iter++) { right_add += *iter; if(right_add > right_max) { right_max = right_add; } } right_max = right_max >= right_add ? right_max : right_add; int mid_max = right_max + left_max; //right,left,mid_max三个比大小,大的为答案 int rl_max = (right > left? right:left); return mid_max > rl_max ? mid_max : rl_max; }
标签:
原文地址:http://www.cnblogs.com/StartoverX/p/4575744.html