DFS专题1
例题一
39.组合总和
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按任意顺序返回这些组合。candidates 中的同一个数字可以无限制重复被选取。如果至少一个数字的被选数量不同,则两种组合是不同的。 对于给定的输入,保证和为 target 的不同组合数少于 150 个。
示例 1:
输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。
示例 2:
输入: candidates = [2,3,5], target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]
题解
这其实是一个第三类背包问题的变种。对于这种要求返回所有满足条件的解时,就应该想到利用回溯法求解,因为获得所有解需要遍历解空间。
在本题中,设置一个变量index,表示在搜寻解空间的每一个阶段我们可以选择第index号数或者不选择index号数。递归的终止条件为target==0或index==candidates.size()
代码如下:
class Solution {
public:
void dfs(vector<vector<int>>& ans, vector<int>& candidates, int target,int index, vector<int>& temp)
{
//直接返回
if(index == candidates.size())
return;
if(target == 0)
{
ans.push_back(temp);
return;
}
//最朴素的剪枝
if(target - candidates[index] >= 0)
{
//选择第index号数
temp.push_back(candidates[index]);
//由于可以重复选取,因此index不需要加1
dfs(ans, candidates, target - candidates[index], index, temp);
temp.pop_back();
}
//不选择index号数
dfs(ans, candidates, target, index + 1, temp);
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> ans;
vector<int> temp;
dfs(ans, candidates, target, 0, temp);
return ans;
}
};
例题二
17.电话号码的数字组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = ""
输出:[]
示例 3:
输入:digits = "2"
输出:["a","b","c]
题解
与上题类似,也是需要找到所有的解,因此采用DFS。
对于本题,需要构建一个哈希表来表示数字到字母的映射。
class Solution {
public:
vector<string> letterCombinations(string digits) {
unordered_map<char, string>mp;
mp['2'] = "abc", mp['3'] = "def", mp['4'] = "ghi", mp['5'] = "jkl",
mp['6'] = "mno", mp['7'] = "pqrs", mp['8'] = "tuv", mp['9'] = "wxyz";
vector<string> ans;
if(digits.size() == 0)
return {};
string temp;
backtrace(mp, ans, temp, digits, 0);
return ans;
}
void backtrace(unordered_map<char, string>& mp, vector<string>& ans, string& temp, const string& digits, int index)
{
if(index == digits.size())
{
ans.push_back(temp);
return;
}
string ch = mp[digits[index]];
for(int i = 0; i < int(ch.size()); i++)
{
temp.push_back(ch[i]);
backtrace(mp, ans, temp, digits, index + 1);
temp.pop_back();
}
}
};
DFS专题1的更多相关文章
- 深度优先搜索(DFS)专题讲座PPT截图【需要原稿的请留言或私信】
以下是今晚我在bilibili直播讲DFS算法的时候的ppt截图,ppt搞了一下午,水平有限,只能做成这个样子,供大家参考!(如果需要原稿,请在评论区留言或私信告诉我,我会发到你的邮箱里),感谢各位的 ...
- (Relax DFS专题1.2)POJ 2386 Lake Counting(使用DFS来计算有多少坨东西是连通的)
题目大意:有N*M的矩阵稻田,'W'表示有积水的地方, '.'表示是干旱的地方,问稻田内一共有多少块积水,根据样例很容易得出,积水是8个方向任一方向相连即可. 题目大意:有N*M的矩阵稻田,'W'表示 ...
- Leetcode之深度优先搜索(DFS)专题-1080. 根到叶路径上的不足节点(Insufficient Nodes in Root to Leaf Paths)
Leetcode之深度优先搜索(DFS)专题-1080. 根到叶路径上的不足节点(Insufficient Nodes in Root to Leaf Paths) 这篇是DFS专题的第一篇,所以我会 ...
- P1040 加分二叉树 区间dp
题目描述 设一个nn个节点的二叉树tree的中序遍历为(1,2,3,…,n1,2,3,…,n),其中数字1,2,3,…,n1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第ii个节 ...
- 【LeetCode】回溯法 backtracking(共39题)
[10]Regular Expression Matching [17]Letter Combinations of a Phone Number [22]Generate Parentheses ( ...
- HDU(搜索专题) 1000 N皇后问题(深度优先搜索DFS)解题报告
前几天一直在忙一些事情,所以一直没来得及开始这个搜索专题的训练,今天做了下这个专题的第一题,皇后问题在我没有开始接受Axie的算法低强度训练前,就早有耳闻了,但一直不知道是什么类型的题目,今天一看,原 ...
- Leetcode之深度优先搜索(DFS)专题-129. 求根到叶子节点数字之和(Sum Root to Leaf Numbers)
Leetcode之深度优先搜索(DFS)专题-129. 求根到叶子节点数字之和(Sum Root to Leaf Numbers) 深度优先搜索的解题详细介绍,点击 给定一个二叉树,它的每个结点都存放 ...
- Leetcode之深度优先搜索(DFS)专题-199. 二叉树的右视图(Binary Tree Right Side View)
Leetcode之深度优先搜索(DFS)专题-199. 二叉树的右视图(Binary Tree Right Side View) 深度优先搜索的解题详细介绍,点击 给定一棵二叉树,想象自己站在它的右侧 ...
- Leetcode之深度优先搜索(DFS)专题-559. N叉树的最大深度(Maximum Depth of N-ary Tree)
Leetcode之深度优先搜索(DFS)专题-559. N叉树的最大深度(Maximum Depth of N-ary Tree) 深度优先搜索的解题详细介绍,点击 给定一个 N 叉树,找到其最大深度 ...
- Leetcode之深度优先搜索(DFS)专题-1020. 飞地的数量(Number of Enclaves)
Leetcode之深度优先搜索(DFS)专题-1020. 飞地的数量(Number of Enclaves) 深度优先搜索的解题详细介绍,点击 给出一个二维数组 A,每个单元格为 0(代表海)或 1( ...
随机推荐
- C语言经典100例【1、2】
[1]三位数字重组问题 题目:有 1.2.3.4 四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 分析:分别把1,2,3,4放在个位.十位和百位,用嵌套循环即可解决.注意要求无重复数字 ...
- go环境搭建及tjfoc-gm安装
go环境搭建及tjfoc-gm安装 一.环境配置 1 首先进入usr/local文件夹,下载go语言环境配置压缩包 wget https://dl.google.com/go/go1.19.3.lin ...
- Git 初始命令行
命令行指令 Git 全局设置 git config --global user.name "Administrator" git config --global user.emai ...
- vue3封装input组件
使用了2种方法去封装input组件(.vue与.jsx) 代码如下 父组件: <template> <div> <h1>input组件封装</h1> & ...
- pytorch学习笔记(3)--dataset使用
下载数据集 import torchvision from torch.utils.tensorboard import SummaryWriter dataset_transform = torch ...
- kora 简单使用实现Api接口 以及mongodb简单使用
//api.jsconst Koa = require('koa'); const router = require('koa-router')(); //路由 const bodyParser = ...
- PostScript语言教程(六、图形变换)
6.1.坐标系变换 POSTSCRIPT图形操作是在一个坐标系中,这个坐标系被称为用户坐标系或用户空间,该坐标系独立于任何物理设备.POSTSCRIPT在用户空间中进行绘制,并将结果传输到特定的打印机 ...
- FFmpeg input与output 函数流程
重要结构体 AVFormatContext AVCodecContextAVCodecAVPacketAVFrame 0.公共部分 av_register_all(); avfilter_regist ...
- UF_OBJ_delete_array_of_objects函数vector转数组用法
1 UF_initialize(); 2 std::vector<tag_t>tool_tag; 3 tag_t ObjectTag = NULL_TAG; 4 int Type, ...
- Docker学习——Dockerfile 指令详解(五)
我们已经介绍了 FROM (指定基础镜像) , RUN(执行命令) ,还提及了 COPY , ADD ,其实 Dockerfile 功能很强大,它提供了十多个指令.下面我们继续讲解其他的指令. COP ...