分治
分支的实质就是递归一个大问题分解成多个子问题,大问题是由多个小问题组成。找重复性
将每一个小写字符转换成大写
代码模板类似泛型递归函数,但是分治需要将这个结果最后合并
回溯
回溯法不断地在每一层去尝试,Leecode 22.括号的生成
Leecode 50.Pow(x,n)
public double mypow(double x,int n){
//分治
//template:1.terminator 2.process(split your big problem) 3.drill down (subproblem),merge(subsult) 4.reverse states
x^n-->2^10 : 2^5--> (2*2)*2
pow(x,n):
subproblem : subsult=pow(x,n/2)
merge:
if n%2==1{
//odd
result=subresult*subsult*x;
}else{
//even
result=subresult*subresult}
}
子集
类似于爬楼梯问题,每次爬一步或两步,这里就是每个元素选或者不选
public class Solution{
public List<List<Interger>> subsets(int[] nums)
{
//
List<List<Interger>> ans=new ArrayList<>();
if(nums==null){
return ans;}
dfs(ans,nums,new ArrayList<Interger>(),0);
return ans;
}
private void dfs(List<List<Interger>> ans,int[] nums,List<Interger> list,int index)
{
//terminator
//走到最末层
if(index==nums.length){
ans.add(new ArrayList<Interger>(list));
return;}
dfs(ans,nunms,list,index+1);//not pick the number at this index
list.add(nums[index]);
dfs(ans,nums,list.copy,index+1);//pick the number at this index
//reverse the number state
list.remove(list.size()+ 1);
}
}