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 输 ...
随机推荐
- Qt中csv文件的导入与导出
转自:http://blog.csdn.net/mingxia_sui/article/details/7683030 CSV 1.简介: 全称:Comma Separated Values. 是“逗 ...
- Qt 生成word、pdf文档
需求:将软件处理的结果保存为一个报告文档,文档中包含表格.图片.文字,格式为word的.doc和.pdf.生成word是为了便于用户编辑. 开发环境:qt4.8.4+vs2010 在qt的官网上对于p ...
- [Xcode 实际操作]八、网络与多线程-(15)使用网址会话对象URLSession下载图片并存储在沙箱目录中
目录:[Swift]Xcode实际操作 本文将演示如何通过网址会话对象URLSession下载图片并存储在沙箱目录中. 网址会话对象URLSession具有在后台上传和下载.暂停和恢复网络操作.丰富的 ...
- sql server之exists用法
- scrapy的中间件Downloader Middleware实现User-Agent随机切换
scrapy的中间件Download Middleware实现User-Agent随机切换 总架构理解Middleware 通过scrapy官网最新的架构图来理解: 从图中我们可以看出,在spid ...
- Hive_Hive和数据仓库简介
文章摘自 : http://www.imooc.com/video/7573 Hive是建立在Hadoop HDFS上的数据仓库基础架构.Hive可以用来进行数据的ETL.Hive定义了简单的类似SQ ...
- axios 访问和返回拦截,token处理,返回异常统一处理
在axios文件夹中,index.js添加拦截 访问拦截: import store from '../store' axios.interceptors.request.use( config =& ...
- python flask学习(1)与Git基础操作
今天从简单的flask开始完成Flask web开发的学习.今天学习了Git和GitHub项目的提交. Git尝试提交过程中出现了"Could not read from remote re ...
- Emacs Org-mode中英文字体设置
Emacs Org-mode中英文字体设置 Table of Contents 1. 缺省字体存在的问题 2. 解决方法 2.1. 环境说明 2.2. 思路和方法 2.3. emacs设置代码 2.4 ...
- drupal基本知识介绍
2. Drupal 安装在安装Drupal前,你需要在服务器上先搭建一个PHP+MySQL环境.专业网站一般是安装LAMP(Linux+Apache+MySQL+PHP).环境的搭建可参考如下文章: ...