LeetCode 39

  class Solution {
public:
void dfs(int dep, int maxDep, vector<int>& cand, int target)
{
if (target < )return;
if (dep == maxDep)
{
if (target == )//到达尾部且等于target
{
vector<int> temp;
for (int i = ; i < maxDep; i++)
{
for (int j = ; j < num[i]; j++)
temp.push_back(cand[i]);
}
ret.push_back(temp);
}
return;
}
for (int i = ; i <= target / cand[dep]; i++)//枚举合适的情况
{
num[dep] = i;
dfs(dep + , maxDep, cand, target - i*cand[dep]);
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target)
{
int n = candidates.size();
if (n == )return ret;
sort(candidates.begin(), candidates.end());
num.resize(n);
ret.clear();
dfs(, n, candidates, target);
return ret; }
private:
vector<vector<int>> ret;//返回的结果
vector<int> num;//用来存储每个数字的次数
};

LeetCode 40

 class Solution {
public:
void dfs(int dep, int maxDep, vector<int>& cand, int target)
{
if (target < )return;
if (dep == maxDep)
{
if (target == )
{
vector<int> temp;
for (int i = ; i < maxDep; i++)
{
for (int j = ; j < num[i]; j++)
temp.push_back(cand[i]);
}
res.insert(temp);
}
return;
}
for (int i = ; i<=; i++)
{
num[dep] = i;
dfs(dep + , maxDep, cand, target - i*cand[dep]);
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target)
{
int n = candidates.size();
if (n == )return ret;
sort(candidates.begin(), candidates.end());
num.resize(n);
ret.clear();
dfs(, n, candidates, target);
set<vector<int>>::iterator it= res.begin();
for (;it!=res.end();it++)
{
ret.push_back(*it);
}
return ret; } private:
vector<vector<int>> ret;
set<vector<int>> res;
vector<int> num;
};

LeetCode 22

backtracking函数书写的一般规则:

(1)函数参数一般要包括位置或者其它(如本题中的还可以剩余左括号个数及左边有多少个左括号没有关闭),这些都是为函数内容作为判断条件,要选择好。

(2)函数开头是函数终止条件(如本题中已经没有左括号可以使用了,故return),并将结束得到的一个结果(元素可以不取的话,则将临时结果变量作为函数的参数<如subset>,每个元素都要取一个结果,则作为类成员)放入result中

(3)就是函数的后半部分,为递归,函数该位置可以放那些元素(循环),每种元素放入后递归下一个位置的元素,当然包括参数的变化。

(1)参数:pos:迭代位置,共有2*n个元素,表示迭代到第几个位置了, left表示左边已经有多少个左括号没有关闭,当left==0时就不能迭代右括号了,remain表示还可以加入左括号的个数,当remain==0的时候,就不能迭代左括号了。

(2)终止条件:当remain==0时,只能加入右括号了,并将这一结果加入最后的结果中

(3)每个位置都只能放入左右括号两种情况,分别取这两种情况,然后进行下一次迭代。

 class Solution {
public:
void dfs(int pos, string &str, int left, int remain, int n){ // left表示左边有多少个左括号没有关闭
if(remain == ){ // 左括号使用完毕 故全部为右括号
for(int i = pos; i < *n; i++)
str[i] = ')';
result.push_back(str);
return;
} if(remain > ){ // remain!=0 说明还可以使用左括号
str[pos] = '(';
dfs(pos+, str, left+, remain-, n);
}
if(left != ){ // left!=0 表示左边还有左括号没有关闭,故可以使用)
str[pos] = ')';
dfs(pos+, str, left-, remain, n);
}
}
vector<string> generateParenthesis(int n) {
string str;
str.resize(*n);
dfs(, str, , n, n);
return result; }
private:
vector<string> result;
};

Leetcode 77

 class Solution {
private:
vector<vector<int>> result;
vector<int> tmp;
public:
void dfs(int dep, const int &n, int k, int count)
{
if (count == k)
{
result.push_back(tmp);
return;
}
if (dep < n - k + count)
{
dfs(dep + , n, k, count);//不取当前数
}
tmp[count] = dep + ; //取当前数
dfs(dep + , n, k, count+); }
vector<vector<int>> combine(int n, int k)
{
if (k>n)k = n;
tmp.resize(k);
dfs(, n, k, );
return result;
} };

LeetCode 17

 string NumToStr[] = {"", "","abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
class Solution {
private:
string str;
vector<string> result;
public:
int charToInt(char c)
{
int i;
stringstream ss;
ss << c;
ss >> i;
return i;
}
void dfs(int dep, int maxDep, const string &digits)
{
if (dep == maxDep)
{
result.push_back(str);
}
int index = charToInt(digits[dep]);
for (int i = ; i < NumToStr[index].size(); i++)
{
str[dep] = NumToStr[index][i];
dfs(dep+,maxDep,digits);
}
} vector<string> letterCombinations(string digits)
{
int n = digits.size();
if (n == )return result;
str.resize(n);
dfs(,n,digits);
return result;
}
};

LeetCode 401

 class Solution {
vector<int> hour = { , , , }, minute = {,,,,,};
public:
void helper(vector<string> & res, pair<int, int> time, int num, int start_point)
{
if (num == )
{
if (time.second < )
res.push_back(to_string(time.first) + ":0" + to_string(time.second));
else
res.push_back(to_string(time.first) + ":" + to_string(time.second));
return;
}
for (int i = start_point; i < hour.size() + minute.size(); i++)
{
if (i < hour.size())
{
time.first += hour[i];
if (time.first < )
helper(res, time, num - , i + );
time.first -= hour[i];
}
else
{
time.second += minute[i - hour.size()];
if (time.second < )
helper(res,time,num-,i+);
time.second -= minute[i - hour.size()];
}
}
}
vector<string> readBinaryWatch(int num)
{
vector<string> res;
helper(res,make_pair(,),num,);
return res;
} };

LeetCode 78

 class Solution {
public:
vector<int>ans;
vector<vector<int>> res;
vector<vector<int>> subsets(vector<int>& nums) {
if(nums.empty())return res;
sort(nums.begin(),nums.end());
dfs(,ans,nums);
return res;
}
void dfs(int k,vector<int> ans, vector<int> nums)
{
res.push_back(ans);
for(int i=k;i<nums.size();i++)
{
ans.push_back(nums[i]);
dfs(i+,ans,nums);
ans.pop_back();
}
}
};

LeetCode 51

 class Solution {
private:
vector<vector<string> > res;
public:
vector<vector<string> > solveNQueens(int n) {
vector<string>cur(n, string(n,'.'));
helper(cur, );
return res;
}
void helper(vector<string> &cur, int row)
{
if(row == cur.size())
{
res.push_back(cur);
return;
}
for(int col = ; col < cur.size(); col++)
if(isValid(cur, row, col))
{
cur[row][col] = 'Q';
helper(cur, row+);
cur[row][col] = '.';
}
} //判断在cur[row][col]位置放一个皇后,是否是合法的状态
//已经保证了每行一个皇后,只需要判断列是否合法以及对角线是否合法。
bool isValid(vector<string> &cur, int row, int col)
{
//列
for(int i = ; i < row; i++)
if(cur[i][col] == 'Q')return false;
//右对角线(只需要判断对角线上半部分,因为后面的行还没有开始放置)
for(int i = row-, j=col-; i >= && j >= ; i--,j--)
if(cur[i][j] == 'Q')return false;
//左对角线(只需要判断对角线上半部分,因为后面的行还没有开始放置)
for(int i = row-, j=col+; i >= && j < cur.size(); i--,j++)
if(cur[i][j] == 'Q')return false;
return true;
}
};

LeetCode 46

 class Solution {
private:
vector<vector<int>> result;
vector<int> visited;
public:
void dfs(int st, int n, vector<int>& v, vector<int>& nums)
{
if (st == n)
{
result.push_back(v);
return;
}
for (int i = ; i < n; i++)
{
if (visited[i] != )
{
visited[i] = ;
v.push_back(nums[i]);
dfs(st + , n,v,nums);
v.pop_back();
visited[i] = ;
}
}
}
vector<vector<int>> permute(vector<int>& nums)
{
int num = nums.size();
visited.resize(num);
vector<int> tmp;
dfs(,num,tmp,nums);
return result;
} };

LeetCode 47

 class Solution {
private:
vector<vector<int>> result;
vector<int> tmpResult;
vector<int> count;
public:
void dfs(int dep, int maxDep, vector<int>& num, vector<int> visited)
{
if (dep == maxDep)
{
result.push_back(tmpResult);
return;
}
for (int i = ; i < num.size(); i++)
{
if (i == )count[dep] = ;
if (!visited[i])
{
count[dep]++;
if (count[dep]> && tmpResult[dep] == num[i])continue;
// 每个位置第二次选数时和第一次一样则continue
visited[i] = ; // 每个位置第二次选择的数时和第一次不一样
tmpResult[dep] = num[i];
dfs(dep + , maxDep, num, visited);
visited[i] = ;
}
}
}
vector<vector<int>> permuteUnique(vector<int> &num)
{
sort(num.begin(), num.end());
tmpResult.resize(num.size());
count.resize(num.size());
vector<int> visited;
visited.resize(num.size());
dfs(, num.size(), num, visited);
return result;
}
};

LeetCode 79

 class Solution {
public:
bool dfs(int xi, int yi, string &word, int index, vector<vector<char> > &board, const int &m, const int &n, int **visited){
visited[xi][yi] = ; // 该结点已经访问过了
if(index + < word.size()){
if(xi- >= && visited[xi-][yi]== && board[xi-][yi] == word[index+]){
if(dfs(xi-, yi, word, index+, board, m, n, visited))return true; //深度遍历
visited[xi-][yi] = ; // 这条路行不通 设为未访问 以不影响下面的遍历
}
if(xi+ <m && visited[xi+][yi]== && board[xi+][yi] == word[index+]){
if(dfs(xi+, yi, word, index+, board, m, n, visited))return true;
visited[xi+][yi] = ;
}
if(yi- >= && visited[xi][yi-]== && board[xi][yi-] == word[index+]){
if(dfs(xi, yi-, word, index+, board, m, n,visited)) return true;
visited[xi][yi-] = ;
}
if(yi+ < n && visited[xi][yi+]== && board[xi][yi+] == word[index+]){
if(dfs(xi, yi+, word, index+, board, m, n,visited)) return true;
visited[xi][yi+] = ;
}
return false;
}else return true;
} void initVisited(int ** visited, const int &m, const int &n){
for(int i = ; i < m; i++)
memset(visited[i], , sizeof(int)*n);
}
bool exist(vector<vector<char> > &board, string word) {
int m = board.size();
int n = board[].size();
int **visited = new int*[m];
for(int i = ; i < m; i++)
visited[i] = new int[n]; for(int i = ; i < m; i++){ // 找到其中的i和j
for(int j = ; j < n; j++){
if(word[] == board[i][j]){
initVisited(visited, m, n);
if(dfs(i, j, word, , board, m, n,visited)) return true;
}
}
}
for(int i = ; i < m; i++)
delete []visited[i];
delete []visited;
return false;
}
};

LeetCode39/40/22/77/17/401/78/51/46/47/79 11道回溯题(Backtracking)的更多相关文章

  1. 关于Mysql错误:./bin/mysqld_safe --user=mysql& [1] 32710 121003 16:40:22 mysqld_safe Logging to '/var/log/mysqld.log'. 121003 16:40:22 mysqld_s

    [root@www]# ./bin/mysqld_safe --user=mysql&[1] 32710[root@www]# 121003 16:40:22 mysqld_safe Logg ...

  2. 编写程序,计算当n=10000,20000,30000...100000时,π的值.求π的近似公式 π=4*(1-1/3+1/5-1/7+1/9-1/11+1/13-...+1/(2n-1)-1/(2n+1))

    该程序是求的 π 近似值,所以随着 i 的增大,值会无线接近于 3.1415926... 代码示例 : package judgment;/** * 编写程序,计算当n=10000,20000,300 ...

  3. Git - error: RPC failed; result=22, HTTP code = 401 fatal: The remote end hung up unexpectedly

    在用Git管理代码版本时,用git push命令提交代码,提示: 有以下几个可能性: Git 版本过低.GitCafe 推荐使用的 Git 版本是 >= 1.7. $ git --version ...

  4. Linux运维40道精华题

    题目 1.什么是运维?什么是游戏运维? 1)运维是指大型组织已经建立好的网络软硬件的维护,就是要保证业务的上线与运作的正常,在他运转的过程中,对他进行维护,他集合了网络.系统.数据库.开发.安全.监控 ...

  5. HDU 6090 17多校5 Rikka with Graph(思维简单题)

    Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...

  6. HDU 6095 17多校5 Rikka with Competition(思维简单题)

    Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...

  7. HDU 6066 17多校3 RXD's date(超水题)

    Problem Description As we all know that RXD is a life winner, therefore he always goes out, dating w ...

  8. 51单片机晶振11.0592M延时函数

    /********************************************** º¯ÊýÃû£ºdelay_ms(uint z) ÑÓʱº¯Êý(12MHZ¾§Õñ) ´Ëº¯ÊýÑ ...

  9. Leetcode 46 47 Permutation, 77 combination

    Permutation class Solution { List<List<Integer>> res = new ArrayList<List<Integer& ...

随机推荐

  1. float 在内存中如何存储的

    float类型数字在计算机中用4个字节存储.遵循IEEE-754格式标准:    一个浮点数有2部分组成:底数m和指数e 底数部分 使用二进制数来表示此浮点数的实际值指数部分 占用8bit的二进制数, ...

  2. 基础知识(javaWeb工程目录结构)及各文件夹的作用

    在Eclipse中只要创建一个Dynamic Web Project,就可以根据创建向导创建出一个典型Java Web站点的目录结构.除非有特殊需要,在大多数情况下都没有必要修改这个目录结构,这也是W ...

  3. 《Java语言程序设计》上机实验

    实验一   Java环境演练   [目的] ①安装并配置Java运行开发环境: ②掌握开发Java应用程序的3个步骤:编写源文件.编译源文件和运行应用程序: ③学习同时编译多个Java源文件. [内容 ...

  4. cookie相关内容

    ----客户端删除cookie <script type="text/javascript">                        function DelC ...

  5. Effective C++ -----条款08: 别让异常逃离析构函数

    析构函数绝对不要吐出异常.如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们(不传播)或结束程序. 如果客户需要对某个操作函数运行期间抛出的异常作出反应,那么class应 ...

  6. 【processing】小代码4

    translate(x,y);  移动坐标原点到x,y处 rotate(angle); 坐标沿原点顺时针转动angle度 scale(n); 绘制图像放大n倍 pushMatrix() 将当前坐标压入 ...

  7. 【hihoCoder】第20周 线段树

    题目: 输入 每个测试点(输入文件)有且仅有一组测试数据. 每组测试数据的第1行为一个整数N,意义如前文所述. 每组测试数据的第2行为N个整数,分别描述每种商品的重量,其中第i个整数表示标号为i的商品 ...

  8. ODBC连接发生错误:未发现数据源名称并且未指定默认驱动程序

    程序在使用ODBC方式连接数据库时发生错误: ERROR [IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序. 什么原因造成的呢? 本人使用&l ...

  9. 解决Fragment在Viepager中切换不保存状态的问题

    在FragmentPagerAdapter中重写以下方法: @Override public Object instantiateItem(ViewGroup container, int posit ...

  10. hdu1071(抛物线弓形面积阿基米德算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1071 题意:给出抛物线的顶点和它与一直线的两交点,求他们围成的面积: 思路: 可以直接求出他们的方程式 ...