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. Different Ways to Add Parentheses

    Given a string of numbers and operators, return all possible results from computing all the differen ...

  2. IO复用与select函数

    socket select函数的详细讲解 select函数详细用法解析      http://blog.chinaunix.net/uid-21411227-id-1826874.html linu ...

  3. POJ 2367 (裸拓扑排序)

    http://poj.org/problem?id=2367 题意:给你n个数,从第一个数到第n个数,每一行的数字代表排在这个行数的后面的数字,直到0. 这是一个特别裸的拓扑排序的一个题目,拓扑排序我 ...

  4. iOS drawRect 和 awakeFromNib

    今天想在一个view上绘制一个虚线边框,百度到的代码如下: CAShapeLayer *borderLayer = [CAShapeLayer layer]; borderLayer.frame = ...

  5. C#小知识特殊的DefaultValueAttribute

    今天看别人写的源码发现一个特殊的DefaultValueAttribute.使用如下. 原始代码: public class People { private string _Name = " ...

  6. Effective C++ -----条款30:透彻了解inlining的里里外外

    将大多数inlining限制在小型.被频繁调用的函数身上.这可使日后的调试过程和二进制升级(binary upgradability)更容易,也可使潜在的代码膨胀问题最小化,使程序的速度提升机会最大化 ...

  7. Divide and Conquer:Cable Master(POJ 1064)

    缆绳大师 题目大意,把若干线段分成K份,求最大能分多长 二分法模型,C(x)就是题干的意思,在while那里做下文章就可以了,因为这个题目没有要求长度是整数,所以我们要不断二分才行,一般50-100次 ...

  8. myEclipse中改了项目名,出现的问题 和 错误java.io.IOException: tmpFile.renameTo(classFile) failed

    今天遇到一个很头疼的问题,建的一个新项目,后来因为一些原因把项目名改了,之后就做了一些业务,但运行时总是没有反应,后来在myEclipse工作空间下的webapps文件中发现, 部署的文件名和项目名称 ...

  9. supersr--时间显示逻辑-->NSDate+NSCalendar

    一种:时间逻辑: - (NSString *)created_at{ //    从后台返回的字符串格式:Mon Aug 03 09:17:31 +0800 2014, //NSDateFormatt ...

  10. 关于Visual Studio 2013 编译 multi-byte character set MFC程序出现 MSB8031 错误的解决办法

    转自:http://blog.csdn.net/xiaochunzao/article/details/16987703 Visual Studio 2013 编译旧的 multi-byte char ...