DFS:深搜+回溯+剪枝解决组合问题

                                               创作不易,感谢支持!!!

一、电话号码的组合

. - 力扣(LeetCode)

class Solution {
public:string hash[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};string path;//记录路径vector<string> ret;//记录返回值vector<string> letterCombinations(string digits) {if(digits.size()==0) return ret;dfs(digits,0);return ret;}void dfs(string &digits,int pos){if(path.size()==digits.size()) {ret.push_back(path);return;}for(auto ch:hash[digits[pos]-'0'])//从当前位置开始遍历,然后再去下一个里面找{path.push_back(ch);dfs(digits,pos+1);path.pop_back();}}
};

二、括号生成

. - 力扣(LeetCode)

class Solution {
public:vector<string> ret;string path;int n;vector<string> generateParenthesis(int _n) {n=_n;dfs(0,0);return ret;}void dfs(int open,int close)//open和close记录上界和下界{if(path.size()==2*n) {ret.push_back(path);return;}if(open<n) {path.push_back('(');dfs(open+1,close);path.pop_back();}if(close<open){path.push_back(')');dfs(open,close+1);path.pop_back();}}
};

 三、组合

. - 力扣(LeetCode)

class Solution {
public:vector<vector<int>> ret;vector<int> path;int k;//用k全局,可以减少一个参数int n;//用n全局,可以减少一个参数vector<vector<int>> combine(int _n, int _k) {k=_k;n=_n;dfs(1);return ret;}void dfs(int pos){if(path.size()==k) {ret.push_back(path);return;}for(int i=pos;i<=n;++i){path.push_back(i);dfs(i+1);path.pop_back();}}
};

四、目标和

. - 力扣(LeetCode)

class Solution {int ret=0;//记录返回结果
public:int findTargetSumWays(vector<int>& nums, int target) {dfs(nums,target,0,0);return ret;}void dfs(vector<int>& nums, int target,int index,int sum){if(index==nums.size()) {if(sum==target)  ++ret;}//选正数else{dfs(nums,target,index+1,sum+nums[index]);dfs(nums,target,index+1,sum-nums[index]);}}};

五、组合总和I

. - 力扣(LeetCode)

class Solution {vector<vector<int>> ret;vector<int> path;
public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {dfs(candidates,0,target);return ret;}void dfs(vector<int>& candidates,int pos,int target){if(target==0){ ret.push_back(path);return;}if(target<0) return;for(int i=pos;i<candidates.size();++i)//第一层,遍历每个数{path.push_back(candidates[i]);dfs(candidates,i,target-candidates[i]);//要从原先的位置去找path.pop_back();}}
};

class Solution {vector<vector<int>> ret;vector<int> path;
public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {dfs(candidates,0,target);return ret;}void dfs(vector<int>& nums,int pos,int target){if(target==0){ ret.push_back(path);return;}if(target<0||pos==nums.size()) return;for(int k=0;k*nums[pos]<=target;++k)//第一层,遍历每个数{if(k) path.push_back(nums[pos]);dfs(nums,pos+1,target-k*nums[pos]);//要从原先的位置去找}for(int k=1;k*nums[pos]<=target;++k) path.pop_back();//}
};

六、组合总和II

. - 力扣(LeetCode)

七、组合总和III

. - 力扣(LeetCode)

class Solution {
public:vector<vector<int>> ret;//记录组合vector<int> path;//记录路径vector<vector<int>> combinationSum3(int k, int n) { if(n>45) return ret;//剪枝dfs(k,n,1);return ret;}void dfs(int k,int n,int pos){if(k==0&&n==0) {ret.push_back(path);return;}if(n<0||k<0) return;for(int i=pos;i<=9;++i){path.push_back(i);dfs(k-1,n-i,i+1);path.pop_back();}}
};

八、组合总和IV

. - 力扣(LeetCode)

该题和前面是类似的,但是用回溯算法,会超时

class Solution {
public:int combinationSum4(vector<int>& nums, int target) {vector<int> dp(target + 1);dp[0] = 1;for (int i = 1; i <= target; i++) {for (int& num : nums) {if (num <= i&& dp[i - num] < INT_MAX - dp[i]) {dp[i] += dp[i - num];}}}return dp[target];}
};

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/792074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬虫部署平台crawlab使用说明

Crawlab 是一个基于 Go 语言的分布式网络爬虫管理平台&#xff0c;它支持 Python、Node.js、Jar、EXE 等多种类型的爬虫。 Crawlab 提供了一个可视化的界面&#xff0c;并且可以通过简单的配置来管理和监控爬虫程序。 以下是 Crawlab 的一些主要优点&#xff1a; 集中管理&am…

【C】leetcode力扣—— 141. 环形链表Ⅰ

目录 141. 环形链表 Ⅰ题目解题思路分析暴力求解&#xff1f;&#xff1f;快慢指针 代码 141. 环形链表 Ⅰ 题目链接: https://leetcode.cn/problems/linked-list-cycle/description/ 题目 题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某…

E-魔法猫咪(遇到过的题,做个笔记)

题解&#xff1a; 来自学长们思路&#xff1a; 其中一种正解是写单调队列。限制队列内的数单调递增&#xff0c;方法为每当新来的数据比当前队尾数据小时队 尾出列&#xff0c;直到能够插入当前值&#xff0c;这保证了队头永远是最小值。因此总体思路是队尾不断插入新值的同时 …

openlayers 入门教程(九):overlay 篇

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

vue-cli打包 nodejs内存溢出 vue2.x Last few GCs

遇到这种情况百度各种博客&#xff0c;什么改package.json里的配置&#xff0c;什么安装increase-memory-limit &#xff0c;都尝试了并没什么用处&#xff0c;最后解决方案为执行下方名单&#xff0c;再次打包就成功了&#xff1a; export NODE_OPTIONS--max_old_space_size4…

单元测试 mockito(二)

1.返回指定值 2.void返回值指定插桩 3.插桩的两种方式 when(obj.someMethod()).thenXxx():其中obj可以是mock对象 doXxx().wien(obj).someMethod():其中obj可以是mock/spy对象 spy对象在没有插桩时是调用真实方法的,写在when中会导致先执行一次原方法,达不到mock的目的&#x…

好物视频素材在哪找?视频素材大全app下载

创作优质视频内容不仅仅是一种艺术&#xff0c;也是一种科学&#xff0c;需要对素材的深刻理解和精心挑选。掌握了这些高清无水印视频素材&#xff0c;您就拥有了创作引人入胜视频内容的强大工具。以下是更多精选的视频素材网站&#xff0c;旨在为您的视频项目提供更广阔的视野…

Python | Leetcode Python题解之第10题正则表达式匹配

题目&#xff1a; 题解&#xff1a; class Solution:def isMatch(self, s: str, p: str) -> bool:m, n len(s), len(p)dp [False] * (n1)# 初始化dp[0] Truefor j in range(1, n1):if p[j-1] *:dp[j] dp[j-2]# 状态更新for i in range(1, m1):dp2 [False] * (n1) …

专升本--python运算符总结

运算优先级 同一个等级是没有先后顺序的&#xff0c;此外&#xff0c;赋值语言的先后问题&#xff1a; 赋值的顺序从上往下&#xff0c;同一行一般都是代表同时进行赋值&#xff0c;如图所示&#xff1a; 一.and A and B&#xff0c;若A,B有任意一个为假&#xff08;0&#x…

希尔排序和快排里的小区间优化

希尔排序 希尔排序是插入排序的优化。 当一串数是逆序时&#xff0c;那么每插入一个数&#xff0c;前面的数都会向后面挪动。 那么这是插入排序的时间复杂度&#xff0c;就会达到O(n^2) 希尔排序是对数组里的数进行预排序。 防止插入排序出现最坏的情况。 预排序&#xf…

ABC318 F - Octopus

解题思路 对于每个宝藏维护个区间&#xff0c;答案一定在这些区间中对于每个区间的端点由小到大排序对于每个点进行判断&#xff0c;若当前位置合法&#xff0c;则该点一定为一个右端点则该点到前一个端点之间均为合法点若前一个点不合法&#xff0c;则一定是某一个区间限制的…

Xen Server 8 Install

Xen Sevrer 前言 XenServer&#xff08;以前称为 Citrix Hypervisor&#xff09;是业界领先的平台&#xff0c;实现了经济高效的桌面、服务器和云虚拟化基础结构。XenServer 支持任意规模或类型的组织整合计算资源&#xff0c;以及将计算资源转换为虚拟工作负载&#xff0c;从…

c++协程详解(二)

前言 这是c协程实现第二篇&#xff0c;这里开始我们将开始真正意义上开始实现协程。对协程基础流程不清楚的&#xff0c;可以看我的第一篇。 后续可能需要一定的模板知识&#xff0c;可以看下我的模板的文章&#xff0c;那些知识就完全够用了。本篇将实现一个协程封装的异步任…

Redis慢日志

SLOWLOG 是用来读取和重置 Redis 慢查询日志的命令&#xff0c;Redis 2.2.12 版本开始支持 1.Redis 慢查询日志概述 客户端从发送命令到获取返回结果经过了以下几个步骤&#xff1a; 1. 客户端发送命令 2. 该命令进入 Redis 队列排队等待执行 3. Redis 开始执行命令 - Red…

浅析JavaWeb内存马基础原理与查杀思路

文章目录 前言Java内存马内存马分类&原理JavaWeb三大组件注入Servlet内存马注入Filter型内存马JAVA Agent内存马 哥斯拉木马0x01 WebShell0x02 MemShell0x03 FilterShell0x04 Arthas排查0x05 scanner查杀 总结 前言 几年前写过《Web安全-一句话木马》&#xff0c;主要介绍…

PurpleKeep:提供Azure管道以创建基础设施并执行Atomic测试

关于PurpleKeep PurpleKeep是一款功能强大的安全测试自动化工具&#xff0c;该工具能够通过提供Azure管道以创建基础设施&#xff0c;并帮助广大研究人员执行Atomic测试。 随着攻击技术种类的迅速增加&#xff0c;以及EDR&#xff08;端点检测和响应&#xff09;和自定义检测规…

二叉树层序遍历 及相关题目

1&#xff0c;力扣102 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例…

Canvas背景绘制-24

本节会详细介绍下&#xff0c;如何绘制面板的背景。 概述 常用的技术称为图块复制(blitting)&#xff0c;即从离屏缓冲区中将内容发生变化的那部分背景图像复制到屏幕上&#xff0c;还有其它两种方法是将所有内容擦除并重新绘制&仅重绘内容发生变化的那部分区域。一般是用…

网络:HTTP协议

目录 序列化与反序列化 守护进程 网络计算器的实现 HTTP协议 http的代码演示 HTTPS 初步理解三次握手&#xff0c;四次挥手 ①tcp是面向连接的通信协议&#xff0c;在通信之前&#xff0c;需要进行3次握手&#xff0c;来进行连接的建立(谁connect谁握手) ②当tcp在断开…

稀碎从零算法笔记Day35-LeetCode:字典序的第K小数字

要考虑完结《稀碎从零》系列了哈哈哈 这道题和【LC.42 接雨水】&#xff0c;我愿称之为【笔试界的颜良&文丑】 题型&#xff1a;字典树、前缀获取、数组、树的先序遍历 链接&#xff1a;440. 字典序的第K小数字 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1…