第七章 回溯算法part01
第七章 回溯算法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) ;
//