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 输 ...
随机推荐
- 洛谷 - P1891 - 疯狂LCM - 线性筛
另一道数据范围不一样的题:https://www.cnblogs.com/Yinku/p/10987912.html $F(n)=\sum\limits_{i=1}^{n} lcm(i,n) $ $\ ...
- Spring中配置Dbutils
<!--配置QueryRunner--> <bean id="runner" class="org.apache.commons.dbutils.Que ...
- 纯css单选框
1.没有用bootstrap时: .has_sel,.un_sel{display:block; width:16px; height: 16px; border: 1px solid #B06A50 ...
- 2014-5-16 NOIP模拟赛
Problem 1 抓牛(catchcow.cpp/c/pas) [题目描述] 农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上出发,尽快把那只奶牛抓回来. 他们都站在数轴上.约翰在N(O≤N≤1 ...
- perl 操作文件指针
之前使用perl 脚本写了一个读取文件的小工具,但是由于当时使用的Tie 的方式,在处理大文件时,效率并不十分理想,所以在网上搜索了perl 如何操作文件指针的文章,自己也学习一下,本博客就是学习过程 ...
- 网络装机pxe服务器的配置过程
网络装机pxe服务器的配置过程 背景: 针对于Linux运维工作中遇到的需要大批量安装Linux系统的情况,通过网络装机的方式实现无人值守安装Linux操作系统,现需要配置一台pxe服务器用于pxe批 ...
- 几例实用的Shell脚本
日常工作中,经常编写一些shell命令或脚本以完成重复性操作,本文分享了最近用到的几例shell实用脚本. 1 特殊文件名的远程拷贝 服务器之间拷贝文件经常使用scp命令,其命令格式: (1)scp ...
- js+canvas(H5)实现小球移动小demo
*canvas提供画布,大小自定义,js得到画布,从画布对象通过getContext('2d')来得到画笔,然后就可以开始画了 代码: <!DOCTYPE html> <html l ...
- 洛谷 P1593 因子和 || Sumdiv POJ - 1845
以下弃用 这是一道一样的题(poj1845)的数据 没错,所有宣称直接用逆元/快速幂+费马小定理可做的,都会被hack掉(包括大量题解及AC代码) 什么原因呢?只是因为此题的模数太小了...虽然990 ...
- 进程---Process
#! /usr/bin/env python# -*- coding:utf-8 -*- """ python中的多线程其实并不是真正的多线程(全局解释器锁(GIL)存在 ...