分治、递归的实现和特性

分治

分支的实质就是递归一个大问题分解成多个子问题,大问题是由多个小问题组成。找重复性
在这里插入图片描述
在这里插入图片描述
将每一个小写字符转换成大写
在这里插入图片描述
代码模板类似泛型递归函数,但是分治需要将这个结果最后合并

回溯

在这里插入图片描述
回溯法不断地在每一层去尝试,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);
   }
}

猜你喜欢

转载自blog.csdn.net/Pang_ling/article/details/105725225
今日推荐