LeetCode || 递归 / 回溯
呜呜呜 递归好不想写qwq
求“所有情况”这种就递归
17. Letter Combinations of a Phone Number
题意:在九宫格上按数字,输出所有可能的字母组合
Input: ""
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
思路:递归回溯求解
递归保存的是每层的状态,因此每层的 str 不应该改,而是更改str和idx后进入到下一层
class Solution {
public:
vector<string> letterCombinations(string digits) {
int n = digits.length();
if (n == ) return {};
vector<string> ans;
string dict[] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
dfs("", , dict, n, digits, ans);
return ans;
}
void dfs(string str, int idx, string dict[], int n, string digits, vector<string> &ans) {
if (idx == n) {
ans.push_back(str);
return;
}
if (digits[idx] <= '' || digits[idx] > '') return;
for (int i = ; i < dict[digits[idx] - ''].length(); i++) {
//str += dict[digits[idx] - '0'][i];
dfs(str + dict[digits[idx] - ''][i], idx + , dict, n, digits, ans);
}
}
};
22. Generate Parentheses
题意:n组括号,求搭配情况数
For example, given n = , a solution set is: [
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
思路:emm递归
快乐 递归函数里记录每层的状态
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> ans;
dfs(ans, "", , , n);
return ans;
}
void dfs(vector<string> &ans, string str, int cnt1, int cnt2, int n) {
if (cnt1 + cnt2 == n * ) {
ans.push_back(str);
return;
}
if (cnt1 < n) dfs(ans, str + '(', cnt1 + , cnt2, n);
if (cnt2 < cnt1) dfs(ans, str + ')', cnt1, cnt2 + , n);
}
};
37. Sudoku Solver
题意:求解数独
思路:八皇后的思路,在每个'.'的格子里填可能的数字,填好一个往下递归,如果出现这个格子没有可填的就回溯到上一层
呜呜呜
class Solution {
public:
void solveSudoku(vector<vector<char>>& board) {
dfs(board, , );
}
bool dfs (vector<vector<char>>& board, int row, int col) {
if (col == ) {
row++;
col = ;
}
if (row == ) return true;
if (board[row][col] != '.') {
return dfs(board, row, col + );
} else {
for (int i = ; i <= ; i++) {
char x = i + '';
if (check(board, row, col, x)) {
board[row][col] = x;
if (dfs(board, row, col + )) return true;
}
board[row][col] = '.';
}
}
return false;
}
bool check (vector<vector<char>>& board, int row, int col, char val) {
for (int i = ; i < ; i++) {
if (board[row][i] == val && i != col) {
return false;
}
}
for (int i = ; i < ; i++) {
if (board[i][col] == val && i != row) {
return false;
}
}
for (int i = row / * ; i < row / * + ; i++) {
for (int j = col / * ; j < col / * + ; j++) {
if (board[i][j] == val && i != row && j != col) {
return false;
}
}
}
return true;
}
};
39. Combination Sum
题意:给出一组无重复的数,在里面任意取数(每个数可以取无数次),使得数字之和为target,求解所有情况
递归中记录(要继续取数的起始位置,当前取过的数,他们的和)
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> res;
dfs(candidates, , , {}, target, res);
return res;
}
void dfs(vector<int>& candidates, int start, int sum, vector<int> cur, int target, vector<vector<int>>& res) {
for (int i = start; i < candidates.size(); i++) {
if (sum + candidates[i] > target) {
continue;
} else if (sum + candidates[i] == target) {
cur.push_back(candidates[i]);
res.push_back(cur);
cur.pop_back();
continue;
} else {
cur.push_back(candidates[i]);
dfs(candidates, i, sum + candidates[i], cur, target, res);
cur.pop_back();
}
}
}
};
LeetCode || 递归 / 回溯的更多相关文章
- [Leetcode] Backtracking回溯法解题思路
碎碎念: 最近终于开始刷middle的题了,对于我这个小渣渣确实有点难度,经常一两个小时写出一道题来.在开始写的几道题中,发现大神在discuss中用到回溯法(Backtracking)的概率明显增大 ...
- 递归回溯 UVa140 Bandwidth宽带
本题题意:寻找一个排列,在此排序中,带宽的长度最小(带宽是指:任意一点v与其距离最远的且与v有边相连的顶点与v的距离的最大值),若有多个,按照字典序输出最小的哪一个. 解题思路: 方法一:由于题目说结 ...
- Leetcode之回溯法专题-216. 组合总和 III(Combination Sum III)
Leetcode之回溯法专题-216. 组合总和 III(Combination Sum III) 同类题目: Leetcode之回溯法专题-39. 组合总数(Combination Sum) Lee ...
- Leetcode之回溯法专题-212. 单词搜索 II(Word Search II)
Leetcode之回溯法专题-212. 单词搜索 II(Word Search II) 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单 ...
- Leetcode之回溯法专题-131. 分割回文串(Palindrome Partitioning)
Leetcode之回溯法专题-131. 分割回文串(Palindrome Partitioning) 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. ...
- Leetcode之回溯法专题-90. 子集 II(Subsets II)
Leetcode之回溯法专题-90. 子集 II(Subsets II) 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入 ...
- Leetcode之回溯法专题-79. 单词搜索(Word Search)
Leetcode之回溯法专题-79. 单词搜索(Word Search) 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元 ...
- Leetcode之回溯法专题-78. 子集(Subsets)
Leetcode之回溯法专题-78. 子集(Subsets) 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = ...
- Leetcode之回溯法专题-77. 组合(Combinations)
Leetcode之回溯法专题-77. 组合(Combinations) 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2 输 ...
随机推荐
- spring boot 使用Schedule创建轻量级定时任务
Scheduled SpringBoot配置定时任务可以直接使用自带的Scheduled,这相当于一个轻量级的Quartz,它可以让我们直接使用注解来完成定时任务的配置. Scheduled调度时间设 ...
- mysql 5.6 安装x64版本
从mysql下载的 32bit的 msi installer 后 , 安装的时候没有发现选择x64的地方, 最后安装完毕后发现server是32bit的,只能删除server( installer ...
- 51nod1640(kruscal)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640 题意:中文题诶- 思路:kruscal 题目要求是在边权 ...
- CentOS 利用 yum 安装卸载软件常用命令
一.yum安装和卸载软件 有个前提是yum安装的软件包都是rpm格式的. 安装的命令是,yum install ~,yum会查询数据库,有无这一软件包,如果有,则检查其依赖冲突关系,如果没有依赖冲突, ...
- 渗透测试之无文件渗透简单使用-windows
无文件渗透测试工作原理:无文件恶意程序最初是由卡巴斯基在2014年发现的,一直不算是什么主流的攻击方式,直到此次事件的发生.说起来无文件恶意程序并不会为了执行而将文件或文件夹复制到硬盘上,反而是将pa ...
- java并发编程(一)
java并发编程(一) 线程基础 在Java代码中,单独创建线程,都需要使用类java.lang.Thread,通常可以通过集成并扩展Thread的run()方法,也可以来创建一个Thread,将一个 ...
- windows下写的shell脚本到linux上不能运行
win上是dos模式,需要改成unix模式 方法是: 在linux上vim 打开脚本,然后:set ff=unix
- Codeforces Round #390 (Div. 2) D
All our characters have hobbies. The same is true for Fedor. He enjoys shopping in the neighboring s ...
- 洛谷 P1121 环状最大两段子段和
https://www.luogu.org/problemnew/show/P1121 不会做啊... 看题解讲的: 答案的两段可能有两种情况:一是同时包含第1和第n个,2是不同时包含第1和第n个 对 ...
- webstock学习
1.WebSocket是HTML5中出出现的新技术,有着web TCP之称,这也是为了适应现在实时传输数据的趋势,在这之前一般采用两种方法进行实时数据交换. 轮询机制,其中又包括长轮询. ①短轮询是指 ...