第七章 回溯算法part01

第七章 回溯算法part01

77. 组合 216.组合总和III 17.电话号码的字母组合

 

 

77. 组合

题目链接 :

77. 组合 - 力扣(LeetCode)

 

Code ( 用 递归 模拟 循环 ) :

 

class Solution {
public:
   vector<vector<int>> combine(int n, int k) {

       vector<int> vec_Temp_Cache_For_RecordNum ;

       vector<vector<int>> vec_2_Dimention_For_Receive_And_Return ;

       work_Recursino_For_forLoop( 1 , 1 , n , k , vec_Temp_Cache_For_RecordNum , vec_2_Dimention_For_Receive_And_Return ) ;


       return vec_2_Dimention_For_Receive_And_Return ;



  }




   void work_Recursino_For_forLoop( int i_Work_In , int i_Layer , int n , int k , vector<int> & vec_Temp_Cache_For_RecordNum , vector<vector<int>> & vec_2_Dimention_For_Receive_And_Return )
  {

       if(i_Layer != k )       // 逻辑 性     /   安全 性       /       效率    
      {
           for( int i = i_Work_In; i <= (( n - k ) + i_Layer ) ; i++ )
          {
               //vec_Temp_Cache_For_RecordNum[ (i_Layer - 1 ) ] = i ;

               vec_Temp_Cache_For_RecordNum.push_back(i) ;


               work_Recursino_For_forLoop( (i + 1 ) , ( i_Layer + 1 ) , n , k , vec_Temp_Cache_For_RecordNum , vec_2_Dimention_For_Receive_And_Return ) ;

               vec_Temp_Cache_For_RecordNum.pop_back() ;


          }
           



      }
       else
      {
           for( int i = i_Work_In; i <= (( n - k ) + i_Layer ) ; i++ )
          {

               //vec_Temp_Cache_For_RecordNum[ (i_Layer - 1 ) ] = i ;

               vec_Temp_Cache_For_RecordNum.push_back(i) ;

               vec_2_Dimention_For_Receive_And_Return.push_back(vec_Temp_Cache_For_RecordNum ) ;

               //work_Recursino_For_forLoop( (i + 1 ) , ( i_Layer + 1 ) , n , k )

               vec_Temp_Cache_For_RecordNum.pop_back() ;


          }



      }

       


  }
};

 

 

216.组合总和III

题目链接 :

216. 组合总和 III - 力扣(LeetCode)

 

 

Code ( 递归 遍历 , 回溯 , 不断 地 更新 Cache 向量 中 的 值 , Cache Sum ) :

class Solution {
public:
   vector<vector<int>> combinationSum3(int k, int n) {

       int target = n ;


       vector<int> vec_Temp_Cache_For_NumSequence ;

       vector<vector<int>> vec_2_Dimention_For_Receive_And_Return ;

       int num_Cache_Sum = 0 ;



       // 尝试 递归 遍历



       fuction_Work_Recursion_For_forLoop(1 , 1 , k , target , vec_Temp_Cache_For_NumSequence , vec_2_Dimention_For_Receive_And_Return , num_Cache_Sum   ) ;  


       return vec_2_Dimention_For_Receive_And_Return ;





  }




   void fuction_Work_Recursion_For_forLoop( int i_Work_In , int i_Layer , int k , int target , vector<int> & vec_Temp_Cache_For_NumSequence , vector<vector<int>> & vec_2_Dimention_For_Receive_And_Return , int & num_Cache_Sum   )
  {                                                                                                                                                                                                   // “ 省 内存 ” , Question : 会 省 寄存器 吗 ? // 代码 会不会 自动 地   进行   相关   优化  

       if( i_Layer != k )
      {
           for( int i = i_Work_In ; i <= (( 9 - k ) + i_Layer ) ; i++ )
          {
               
               num_Cache_Sum += i ;

               vec_Temp_Cache_For_NumSequence.push_back(i) ;

               //

               fuction_Work_Recursion_For_forLoop( ( i + 1 ) , ( i_Layer + 1 ) , k , target , vec_Temp_Cache_For_NumSequence , vec_2_Dimention_For_Receive_And_Return , num_Cache_Sum     )     ;

               
               num_Cache_Sum -= i ;

               vec_Temp_Cache_For_NumSequence.pop_back() ;



          }



      }
       else
      {
           for( int i = i_Work_In ; i <= (( 9 - k ) + i_Layer ) ; i++ )
          {

               num_Cache_Sum += i ;

               vec_Temp_Cache_For_NumSequence.push_back(i) ;

               //

               if(num_Cache_Sum == target )
              {

                   vec_2_Dimention_For_Receive_And_Return.push_back(vec_Temp_Cache_For_NumSequence ) ;


              }
               
               

               num_Cache_Sum -= i ;
               
               vec_Temp_Cache_For_NumSequence.pop_back() ;






          }



      }

       



  }


};

 

 

17.电话号码的字母组合

题目地址 :

17. 电话号码的字母组合 - 力扣(LeetCode)

 

 

 

 

Code ( 版本 1 ( Cache 字符串 引用 + 维护 ) ) :

class Solution {
public:
   vector<string> letterCombinations(string digits) {
       
       vector<vector<string>> vec_Resource_Num_Map_Letter = { { "a" , "b" , "c" }, { "d" , "e" , "f" } , {"g","h","i"} , {"j","k","l"} , {"m","n","o"} , {"p" , "q" , "r" , "s" } , { "t" , "u" , "v"} , { "w" , "x" , "y" , "z" } } ;

       //vec_Resource_Num_Map_Letter

       string str_Cache = "" ;

       vector<string> vec_Str_For_Receive_And_Return ;



       if( digits == "")
      {

           return vec_Str_For_Receive_And_Return ;


      }


       fuction_Work_Recursion_For_forLoop( 0 , str_Cache , vec_Str_For_Receive_And_Return , vec_Resource_Num_Map_Letter , digits ) ;      



       return vec_Str_For_Receive_And_Return ;

  }


   void fuction_Work_Recursion_For_forLoop(int i_Layer , string & str_Cache , vector<string> & vec_Str_For_Receive_And_Return , vector<vector<string>> & vec_Resource_Num_Map_Letter , string digits )
  {
       char char_Cache ;
       

       if( digits[i_Layer + 1] != '\0' )
      {
           char_Cache = digits[i_Layer ] ;

           int num_Temp_Cache = int ((char_Cache - 0x30 ) - 2 ) ;


           for(int i = 0 ; i < vec_Resource_Num_Map_Letter[num_Temp_Cache].size() ; i++ )
          {
               str_Cache += vec_Resource_Num_Map_Letter[num_Temp_Cache][i] ;


               //

               fuction_Work_Recursion_For_forLoop( (i_Layer + 1 ) , str_Cache , vec_Str_For_Receive_And_Return , vec_Resource_Num_Map_Letter , digits )   ;    


               str_Cache = str_Cache.substr(0 , i_Layer ) ;


          }



      }
       else
      {
           char_Cache = digits[i_Layer ] ;

           int num_Temp_Cache = int ((char_Cache - 0x30 ) - 2 ) ;


           for(int i = 0 ; i < vec_Resource_Num_Map_Letter[num_Temp_Cache].size() ; i++ )
          {
               str_Cache += vec_Resource_Num_Map_Letter[num_Temp_Cache][i] ;


               //
               vec_Str_For_Receive_And_Return.push_back(str_Cache ) ;


               str_Cache = str_Cache.substr(0 , i_Layer ) ;


          }





      }





  }




};

 

 

Code ( 版本 2 ( Cache 字符串 传值) ) :

 

class Solution {
public:
   vector<string> letterCombinations(string digits) {
       
       vector<vector<string>> vec_Resource_Num_Map_Letter = { { "a" , "b" , "c" }, { "d" , "e" , "f" } , {"g","h","i"} , {"j","k","l"} , {"m","n","o"} , {"p" , "q" , "r" , "s" } , { "t" , "u" , "v"} , { "w" , "x" , "y" , "z" } } ;

       //vec_Resource_Num_Map_Letter

       string str_Cache = "" ;

       vector<string> vec_Str_For_Receive_And_Return ;



       if( digits == "")
      {

           return vec_Str_For_Receive_And_Return ;


      }


       fuction_Work_Recursion_For_forLoop( 0 , str_Cache , vec_Str_For_Receive_And_Return , vec_Resource_Num_Map_Letter , digits ) ;      



       return vec_Str_For_Receive_And_Return ;

  }


   void fuction_Work_Recursion_For_forLoop(int i_Layer , string str_Cache , vector<string> & vec_Str_For_Receive_And_Return , vector<vector<string>> & vec_Resource_Num_Map_Letter , string digits )
  {
       char char_Cache ;
       

       if( digits[i_Layer + 1] != '\0' )
      {
           char_Cache = digits[i_Layer ] ;

           int num_Temp_Cache = int ((char_Cache - 0x30 ) - 2 ) ;


           for(int i = 0 ; i < vec_Resource_Num_Map_Letter[num_Temp_Cache].size() ; i++ )
          {
               //str_Cache += vec_Resource_Num_Map_Letter[num_Temp_Cache][i] ;


               //

               fuction_Work_Recursion_For_forLoop( (i_Layer + 1 ) , (str_Cache + vec_Resource_Num_Map_Letter[num_Temp_Cache][i] ) , vec_Str_For_Receive_And_Return , vec_Resource_Num_Map_Letter , digits )   ;    


               //str_Cache = str_Cache.substr(0 , i_Layer ) ;


          }



      }
       else
      {
           char_Cache = digits[i_Layer ] ;

           int num_Temp_Cache = int ((char_Cache - 0x30 ) - 2 ) ;


           for(int i = 0 ; i < vec_Resource_Num_Map_Letter[num_Temp_Cache].size() ; i++ )
          {
               //str_Cache += vec_Resource_Num_Map_Letter[num_Temp_Cache][i] ;


               //
               vec_Str_For_Receive_And_Return.push_back(str_Cache + vec_Resource_Num_Map_Letter[num_Temp_Cache][i] ) ;


               //str_Cache = str_Cache.substr(0 , i_Layer ) ;


          }





      }





  }




};
 

 

 

 

posted @   晴夜空  阅读(4)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示