分治算法
「分而治之」,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
我们发现分治算法的思想和递归相似,实际上 递归算法∈分治算法
解题步骤:
- 分解:把问题分解为子问题
- 求解:递归求解各个子问题
- 合并:将子问题解合并为原问题到解
练习题
912. 排序数组
思路
- 考虑归并排序
- 实现
代码
cpp
class Solution {
public:
void mergeSort(vector<int>& nums, int l, int r) {
if(l >= r) return;
int m = (l + r) / 2;
mergeSort(nums, l, m);
mergeSort(nums, m + 1, r);
int i = l, j = m + 1;
vector<int> ans;
while(i <= m && j <= r) {
int val = nums[i] <= nums[j] ? nums[i++] : nums[j++];
ans.push_back(val);
}
while(i <= m) ans.push_back(nums[i++]);
while(j <= r) ans.push_back(nums[j++]);
for(int i = l; i <= r; i++) {
nums[i] = ans[i - l];
}
}
vector<int> sortArray(vector<int>& nums) {
int sz = nums.size();
if(sz <= 1) return nums;
mergeSort(nums, 0, sz - 1);
return nums;
}
};
704. 二分查找
思路
- 二分查找模板题
- 实现
代码
cpp
class Solution {
public:
int search(vector<int>& nums, int target) {
int sz = nums.size();
int l = 0, r = sz - 1;
while(l < r) {
int m = l + (r - l) / 2;
if(nums[m] == target) return m;
else if(nums[m] > target) r--;
else l++;
}
return nums[l] == target ? l : -1;
}
};