呜呜呜 递归好不想写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 || 递归 / 回溯的更多相关文章

  1. [Leetcode] Backtracking回溯法解题思路

    碎碎念: 最近终于开始刷middle的题了,对于我这个小渣渣确实有点难度,经常一两个小时写出一道题来.在开始写的几道题中,发现大神在discuss中用到回溯法(Backtracking)的概率明显增大 ...

  2. 递归回溯 UVa140 Bandwidth宽带

    本题题意:寻找一个排列,在此排序中,带宽的长度最小(带宽是指:任意一点v与其距离最远的且与v有边相连的顶点与v的距离的最大值),若有多个,按照字典序输出最小的哪一个. 解题思路: 方法一:由于题目说结 ...

  3. Leetcode之回溯法专题-216. 组合总和 III(Combination Sum III)

    Leetcode之回溯法专题-216. 组合总和 III(Combination Sum III) 同类题目: Leetcode之回溯法专题-39. 组合总数(Combination Sum) Lee ...

  4. Leetcode之回溯法专题-212. 单词搜索 II(Word Search II)

    Leetcode之回溯法专题-212. 单词搜索 II(Word Search II) 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单 ...

  5. Leetcode之回溯法专题-131. 分割回文串(Palindrome Partitioning)

    Leetcode之回溯法专题-131. 分割回文串(Palindrome Partitioning) 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. ...

  6. Leetcode之回溯法专题-90. 子集 II(Subsets II)

    Leetcode之回溯法专题-90. 子集 II(Subsets II) 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入 ...

  7. Leetcode之回溯法专题-79. 单词搜索(Word Search)

    Leetcode之回溯法专题-79. 单词搜索(Word Search) 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元 ...

  8. Leetcode之回溯法专题-78. 子集(Subsets)

    Leetcode之回溯法专题-78. 子集(Subsets) 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = ...

  9. Leetcode之回溯法专题-77. 组合(Combinations)

    Leetcode之回溯法专题-77. 组合(Combinations)   给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2 输 ...

随机推荐

  1. POJ3461 【KMP(粗糙模板)】

    题意: 给你两个字符串p和s,求出p在s中出现的次数. 这道题,abababa中aba出现了3次. 有其他题是求abababa,aba就是2次. 需注意. KMP 模板 //#include<b ...

  2. CodeForces717C 【数学】

    题意: 给你n个数既表示a类的值也表示b类的值,然后计算a和b类两两搭配相乘相加,使得答案最小: 思路: 显而易见的方案是最小乘最大,次小乘次大,然后依次下去.. 可以那个特例证明这个是对的 #inc ...

  3. Codevs 1043 方格取数

    1043 方格取数 2000年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Descri ...

  4. PJzhang:国内常用威胁情报搜索引擎说明

    猫宁!!! 参考链接: https://www.freebuf.com/column/136763.html https://www.freebuf.com/sectool/163946.html 如 ...

  5. C#邮包计费

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  6. iOS开发 - 多线程实现方案之GCD篇

    GCD概念 GCD为Grand Central Dispatch的缩写,纯c语言编写,是Apple开发的一个多核编程的较新的解决方法.它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统.它是 ...

  7. 快速删除node_modules文件夹

    前言 当安装了较多模块后,node_modules目录下的文件会很多,直接删除整个目录会很慢,下面介绍些快速删除node_modules目录的方法. 方法一:使用rimraf模块的命令 在全局安装ri ...

  8. STP-3-收敛到新的STP拓扑

    事实上,即使拓扑已经稳定,STP也从未停止工作,对每个收到的BPDU,交换机都会重新计算自己对于根桥,RP,DP的选择.在稳定的拓扑中,交换机收到的BPDU不变,因此对这些BPDU的处理会一遍一遍产生 ...

  9. VLAN-3-VLAN Trunk:ISL和802.1Q

      (1)ISL和802.1Q概念       通过使用VLAN Trunk链路,设备可以通过一条链路发送去往多个vlan的流量.为了知道数据帧属于哪个vlan,发送方会添加原始以太网数据帧的头部,这 ...

  10. c# JsonReader读取json字符串

    使用JsonReader读Json字符串:      string jsonText = @"{""input"" : ""val ...