第七章 回溯算法part01
77. 组合 216.组合总和III 17.电话号码的字母组合
77. 组合
题目链接 :
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
题目链接 :
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.电话号码的字母组合
题目地址 :
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 ) ;
}
}
}
};