分治算法
分治
分治,即“分而治之”
就是把原问题划分成若千个同类子问题,分别解决后,再把结果合并起来
关键点:
原问题和各个子问题都是重复的(同类的)一递归定义
除了向下递归“问题”,还要向上合并“结果”
分治算法- -般用递归实现
分治算法的"递归状态树”
实战
50.Pow(x, n)
https://leetcode.cn/problems/powx-n/
class Solution {
public:
double myPow(double x, int n) {
if(n==0) return 1;
if(n == -(1ll << 31)) return 1.0/(myPow(x,-(n+1))*x);
if(n < 0) return 1.0/myPow(x,-n);
double temp = myPow(x,n/2);
double ans = temp*temp;
if(n%2==1) ans *=x;
return ans;
}
};
class Solution {
public:
double myPow(double x, long long n) {
if(n==0) return 1;
//if(n==-(1ll<<31)) return 1.0/myPow(x,-(n+1)*x);
if(n<0) return 1.0/myPow(x,-n);
double temp=myPow(x,n/2);
double ans = temp*temp;
if(n%2 == 1) ans*=x;
return ans;
}
};
22.括号生成
https://leetcode.cn/problems/generate-parentheses/
分治划分子问题的标准:不重不漏
class Solution {
public:
vector<string> generateParenthesis(int n) {
if(n == 0) return {""};
if(store.find(n) != store.end()) return store[n];
vector<string> ans;
for(int k=1;k<=n;k++)
{
vector<string> A = generateParenthesis(k-1);
vector<string> B = generateParenthesis(n-k);
for(string & a:A)
{
for(string & b:B)
{
ans.push_back("(" + a + ")" +b);
}
}
}
store[n]=ans;
return ans;
}
private:
unordered_map<int ,vector<string>> store;
};
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习