分治、递归的实现和特性

分治

分支的实质就是递归一个大问题分解成多个子问题,大问题是由多个小问题组成。找重复性
分治、递归的实现和特性_第1张图片
分治、递归的实现和特性_第2张图片
将每一个小写字符转换成大写
分治、递归的实现和特性_第3张图片
代码模板类似泛型递归函数,但是分治需要将这个结果最后合并

回溯

分治、递归的实现和特性_第4张图片
回溯法不断地在每一层去尝试,Leecode 22.括号的生成

Leecode 50.Pow(x,n)

分治、递归的实现和特性_第5张图片

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

子集

分治、递归的实现和特性_第6张图片
类似于爬楼梯问题,每次爬一步或两步,这里就是每个元素选或者不选

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

你可能感兴趣的:(leetcode,数据结构与算法)