递归,回溯,分治(C++刷题笔记)
递归,回溯,分治(C++刷题笔记)
78. 子集
力扣
预备知识
nums[]=[1,2,3],先将子集[1],[1,2],[1,2,3]打印
#include <bits/stdc++.h>using namespace std;int main() {vector<int>nums;for (int i=1;i<=3;i++){nums.push_back(i);}vector<int>item;//生成各个子集vector< vector<int> >res;//结果数组for (int i = 0; i < nums.size(); ++i){item.push_back(nums[i]);res.push_back(item);}for (int i = 0; i < res.size(); ++i){for (int j = 0; j < res[i].size(); ++j){printf("[%d]",res[i][j]);}printf("\n");}return 0;}
[1]
[1][2]
[1][2][3]
递归写法
#include <bits/stdc++.h>using namespace std;void recur(int i, vector<int> &nums, vector<int> &item, vector<vector<int> > &res) {if (i >= nums.size()) {return;}item.push_back(nums[i]);res.push_back(item);recur(i + 1, nums, item, res);}int main() {vector<int> nums;for (int i = 1; i <= 3; i++) {nums.push_back(i);}vector<int> item;//生成各个子集vector<vector<int> > res;//结果数组recur(0, nums, item, res);for (int i = 0; i < res.size(); ++i) {for (int j = 0; j < res[i].size(); ++j) {printf("[%d]", res[i][j]);}printf("\n");}return 0;}
题目代码
子集问题,变量数组,每次有两种选择,选或者不选,逐层递归
class Solution {
public:vector<vector<int>> subsets(vector<int>& nums) {vector<int>item;vector<vector<int> >res;res.push_back(item);recur(0,nums,item,res);return res;}void recur(int i,vector<int>&nums,vector<int>&item,vector<vector<int> >&res){if(i>=nums.size()){return;}item.push_back(nums[i]);//选择nums[i]res.push_back(item);recur(i+1,nums,item,res);item.pop_back();//不选择nums[i]recur(i+1,nums,item,res);}
};
90. 子集 II
力扣
题目代码
//使用set去重 最后几个样例过不去
class Solution {
public:vector<vector<int>> subsetsWithDup(vector<int> &nums) {vector<vector<int> > res;vector<int> item;set<vector<int> > res_set;sort(nums.begin(), nums.end());res.push_back(item);//首先把空集放进去recur(0, nums, item, res, res_set);return res;}//函数参数注意引用 尤其是set 否则无法完成去重void recur(int i, vector<int> &nums, vector<int> &item, vector<vector<int> > &res, set<vector<int> > &res_set) {if (i >= nums.size())return;item.push_back(nums[i]);if (res_set.find(item) == res_set.end()) { //如果不在集合里可以放入res.push_back(item);res_set.insert(item);}recur(i + 1, nums, item, res, res_set);item.pop_back();recur(i + 1, nums, item, res, res_set);}
};
40. 组合总和 II
力扣
题目代码
class Solution {
public:vector<vector<int>> combinationSum2(vector<int> &candidates, int target) {vector<vector<int> > res;vector<int> item;set<vector<int> > res_set;sort(candidates.begin(), candidates.end());recur(0, candidates, res, item, res_set, 0, target);return res;}void recur(int i, vector<int> &nums, vector<vector<int> > &res,vector<int> &item, set<vector<int> >&res_set, int sum,int target) {if (i >= nums.size() || sum > target) {return;}sum += nums[i];item.push_back(nums[i]);if (target == sum && res_set.find(item) == res_set.end()) {res.push_back(item);res_set.insert(item);}recur(i + 1, nums, res, item, res_set, sum, target);sum -= nums[i];item.pop_back();recur(i + 1, nums, res, item, res_set, sum, target);}
};
22. 括号生成
力扣
预备知识
首先递归生成所有可能
#include <bits/stdc++.h>using namespace std;
void dfs(string item,int n,vector<string>&res){if(item.size()==2*n){res.push_back(item);return;}dfs(item+'(',n,res);dfs(item+')',n,res);}int main() {vector<string >res;dfs("",2,res);for (int i = 0; i < res.size(); ++i){cout<<res[i]<<endl;}return 0;}
((((
((()
(()(
(())
()((
()()
())(
()))
)(((
)(()
)()(
)())
))((
))()
)))(
))))
然后判断合法括号组合
左括号右括号数量不超过n
先有左括号才能放右括号
题目代码
class Solution {
public:vector<string> generateParenthesis(int n) {vector<string>res;dfs("",n,n,res);return res;}void dfs(string item,int left,int right,vector<string>&res){if(left==0&&right==0){res.push_back(item);return;}if(left>0){dfs(item+'(',left-1,right,res);}if(left<right){dfs(item+')',left,right-1,res);}}
};
315. 计算右侧小于当前元素的个数
力扣
预备知识
已知两个有序数组,归并这两个数组
#include <bits/stdc++.h>using namespace std;void merge_sort(vector<int> &a1, vector<int> &a2, vector<int> &merge_a) {int i = 0;int j = 0;while (i < a1.size() && j < a2.size()) {if (a1[i] <= a2[j]) {merge_a.push_back(a1[i]);i++;} else {merge_a.push_back(a2[j]);j++;}}for (; i < a1.size(); i++) {merge_a.push_back(a1[i]);}for (; j < a2.size(); j++) {merge_a.push_back(a2[i]);}}int main() {vector<int> res;vector<int>a1;vector<int>a2;int t1[]={2,5,8,20};int t2[]={1,3,5,7,30,50};for (int i = 0; i <4 ; ++i) {a1.push_back(t1[i]);}for (int i = 0; i <6 ; ++i) {a2.push_back(t2[i]);}merge_sort(a1,a2,res);for (int i = 0; i < res.size(); ++i) {printf("%d ",res[i]);}return 0;}
1 2 3 5 5 7 8 20 30 30
题目代码
暴力方法,对于每个元素,从左向右遍历,扫描右侧比它小的个数,累加求和
考虑归并两个有序数组,i,j为两个数组的指针,需要将指针i指向的元素插入时,对应的count[i]就是j的值,count[i]为右侧比它小的数
排序后,使用pair绑定<num[i],index>排序后它们的右侧比它本身小的个数就得到了
class Solution {public:vector<int> countSmaller(vector<int> &nums) {vector<pair<int,int> > vec;vector<int> cnt;//这里注意下是nums的大小 不是vec的大小 vec初始为0一开始没注意始终没有输出for (int i = 0; i < nums.size(); ++i) {vec.push_back(make_pair(nums[i], i));cnt.push_back(0);}merge_sort(vec, cnt);return cnt;}void merge_sort_cnt(vector<pair<int,int> > &vec1, vector<pair<int,int> > &vec2, vector<pair<int,int> > &vec,vector<int> &cnt) {int i = 0;int j = 0;while (i < vec1.size() && j < vec2.size()) {if (vec1[i].first <= vec2[j].first) {cnt[vec1[i].second] += j;vec.push_back(vec1[i]);i++;} else {vec.push_back(vec2[j]);j++;}}for (; i < vec1.size(); i++) {cnt[vec1[i].second] += j;vec.push_back(vec1[i]);}for (; j < vec2.size(); j++) {vec.push_back(vec2[j]);}}//归并排序void merge_sort(vector<pair<int,int> > &vec, vector<int> &cnt) {if (vec.size() < 2) {return;}int mid = vec.size() / 2;vector<pair<int,int> > vec1;vector<pair<int,int> > vec2;for (int i = 0; i < mid; ++i) {vec1.push_back(vec[i]);}for (int i = mid; i < vec.size(); ++i) {vec2.push_back(vec[i]);}merge_sort(vec1, cnt);merge_sort(vec2, cnt);vec.clear();merge_sort_cnt(vec1, vec2, vec, cnt);}};
51. N 皇后
力扣
void put_down_the_queen(int x, int y, vector<vector<int> > &mark) {//8个方向static const int dx[] = {-1, 1, 0, 0, -1, -1, 1, 1};static const int dy[] = {0, 0, -1, 1, -1, 1, -1, 1};mark[x][y] = 1;for (int i = 0; i < mark.size(); ++i) {for (int j = 0; j < 8; ++j) {int newx = x + i*dx[j];//向8个方向延长int newy = y + i*dy[j];if (newx >= 0 && newx < mark.size() && newy >= 0 && newy < mark.size()) {mark[newx][newy] = 1;}}}}
对于n*n棋盘,每行都有且只能放一个皇后,对每行放置,放置按照列顺序放置,更新mark数组,递归进行下一行皇后放置。
题目代码
class Solution {
public:vector<vector<string>> solveNQueens(int n) {vector<vector<string> > res;//存储最终结果vector<vector<int> > mark;//标记期盼是否可以放置皇后二维数组vector<string> location;//记录结果for (int i = 0; i < n; ++i) {mark.push_back(vector<int>());for (int j = 0; j < n; ++j) {mark[i].push_back(0);}location.push_back("");location[i].append(n, '.');}solve(0,n,location,res,mark);return res;}void solve(int k, int n, vector<string> &location, vector<vector<string> > &res, vector<vector<int> > &mark) {//如果放置完n个皇后if (k == n) {res.push_back(location);return;}for (int i = 0; i < n; ++i) {if (mark[k][i] == 0) {vector<vector<int> > tmp = mark;location[k][i] = 'Q';put_down_the_queen(k, i, mark);solve(k + 1, n, location, res, mark);mark = tmp;//回溯location[k][i] = '.';}}}
//放皇后 放皇后的时候顺便把它8个方向给标记一下void put_down_the_queen(int x, int y, vector<vector<int> > &mark) {//8个方向static const int dx[] = {-1, 1, 0, 0, -1, -1, 1, 1};static const int dy[] = {0, 0, -1, 1, -1, 1, -1, 1};mark[x][y] = 1;for (int i = 0; i < mark.size(); ++i) {for (int j = 0; j < 8; ++j) {int newx = x + i*dx[j];int newy = y + i*dy[j];if (newx >= 0 && newx < mark.size() && newy >= 0 && newy < mark.size()) {mark[newx][newy] = 1;}}}}
};
相关文章:
递归,回溯,分治(C++刷题笔记)
递归,回溯,分治(C刷题笔记) 78. 子集 力扣 预备知识 nums[][1,2,3],先将子集[1],[1,2],[1,2,3]打印 #include <bits/stdc.h>using namespace std;int main() {vector<int>nums;for (int i1;i<3;i){nums.push_…...

CentOS 7.6更改yum源
使用字符串替换 我这里的操作参考了https://baijiahao.baidu.com/s?id1708418392526536542&wfrspider&forpc这篇文章,https://mirrors.tuna.tsinghua.edu.cn/help/centos/是清华大学官网教程。 /etc/yum.repos.d/CentOS-Base.repo文件如下: #…...
三、进度管理
3、 [单选] 一个项目实施团队需要满足一份非常严格的进度计划。相对于已完成的事项,这样会导致正在进行的工作超过负荷。为了解决这个问题,项目经理需要获得额外的资源。项目经理应该向发起人提供什么理由来支持追加资源的请求? A project im…...

基于LEACH和HEED的WSN路由协议研究与改进(Matlab代码实现)
目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨💻4 Matlab代码 💥1 概述 无线传感器网络是不断发展的传感技术之一,也用于执行不同的任务。这些类型的网络在许多领域都是有益的,…...
ChatGPT镜像站收集【Free ChatGPT】(一)
文章目录 Free ChatGPT Site ListLast synced:BeiJingT 2023-04-18妙站站点列表Free ChatGPT Site List 这儿收集了一些免费好用的ChatGPT镜像站点 ⭐:使用不受限🔑:需要进行登录⛔:有限地使用次数后需提供key或进行充值❓ :未测试,未进行标注也为未测试Last synced:BeiJin…...
PHP面试宝典之Mysql数据库基础篇
字符类型: tinyint(4):占1个字节,4代表字段值长度,用0填充,搭配zero fill使用 有符号:取值范围 负128 ~ 正127; 无符号:取值范围 0 ~ 255; 默认无…...
4月记录总结
4/24 1.GBK12、16、24是指什么 GBK12、GBK16、GBK24是指不同的字体点阵大小,也就是字体的显示大小。在GBK编码中,一个汉字通常是由多个点阵组成的,其中点阵的大小就是字体的点阵大小。具体来说: GBK12:指每个汉字由12…...

每日学术速递4.29
CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.LG 1.A Cookbook of Self-Supervised Learning 标题:自监督学习食谱 作者:Randall Balestriero, Mark Ibrahim, Vlad Sobal, Ari Morcos, Shashank Shekhar, Tom…...

整数在内存中的存储:原码、反码、补码 大小端字节序
本篇博客会讲解整数在内存中的存储形式,以及整数二进制的3种表示形式:原码、反码、补码,还有大小端的相关知识点。相信读完本篇博客,大家对内存的了解会上一个台阶。 注意:本篇博客讨论的是整数在内存中的存储&#x…...

【方法】 如何批量将RAR或其他压缩格式转换成ZIP?
压缩文件的格式有很多种,比如RAR、ZIP、7-Zip、CAB、ARJ、ACE、TAR、BZ2等等。因为需求不同,或者不同平台对上传的压缩包格式要求不同,我们往往需要把压缩文件进行格式转换,那压缩文件不同格式之间如何进行转换呢? 如…...

《道德经》
《道德经》是春秋时期老子(李耳)的哲学作品,又称《道德真经》、《老子》、《五千言》、《老子五千文》,是中国古代先秦诸子分家前的一部著作,是道家哲学思想的重要来源。 道德经分上下两篇,原文上篇《德经…...

ABI Research产业研究:ZiFiSense如何革新物流货物及运输包装追踪
“文章源自前沿科技研究机构ABI Research产业研究,重点介绍了ZETA LPWA协议开发公司纵行科技在业务发展、M-FSK调制技术以及ZETag云标签系列产品在物流货物追踪与包装管理等方面的应用分析,还分享了纵行科技ZETA技术在商业市场和生态系统方面的发展情况。…...

家乡特色推荐系统~java~mysql
摘 要 在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括家乡特色推荐的网络应用,在外国家乡特色推荐系统已经是很普遍的方式,不过国内的管理网站可能还处于起步阶段。家乡特色推荐系统采用java技术&…...

二维码在设备点维一体化管理中的应用
随着科技发展,设备点维一体化管理体系应运而生,该管理体系的出现让设备维护保养变得更加高效精细化。 设备点维一体化管理体系以设备点检和维护保养为基础,通过日常、专业及精密点检,对点检测得的数据和设备给油脂保养情况进行统…...

基于simulink使用混合波束成形对射频毫米波发射器进行建模
一、前言 本例说明了一种使用66元件混合波束成形天线对32 GHz QPSK射频发射和接收系统进行系统级建模和仿真的方法。该系统包括射频缺陷、发射阵列辐射效应、窄带接收阵列和基带接收器,可校正系统损伤和消息解码。天线波束形成方向使用方位角和仰角定义,…...
面试官:v-model原理?
什么是v-model v-model是Vue框架中的一个指令,用来实现双向数据绑定。它能够在表单元素(如输入框、复选框等)和Vue实例中的数据属性之间建立起一条双向数据通道,使得当表单元素的值发生改变时,对应的数据属性也会相应…...

兰林:科技赋能健康产业 助力乡村振兴建设
万民健康创始人 万民智养中医创始人 万民星农CEO兰林 党建引领谋发展 , 旗帜下乡促振兴 。 乡村振兴,健康先行。自党的十八大以来,国家卫健委贯彻落实“以基层为重点”的党的卫生与健康工作方针,推动医疗卫生工作重心下移、资源下…...

小红书流量密码是什么,怎么掌握并运用
现在是个流量的社会,因为流量其实代表的就是收益,那面对一个流量时代,小红书现在而言毫无疑问是蓝海,品牌想要做好,自然要掌握平台流量密码。今天来和大家一起分享一下小红书流量密码有什么,流量密码可以用…...

FL Studio 2023中文高级版水果编曲软件下载
FL Studio 2023中文版是一款非常经典的音乐制作软件,这款软件除了可以为用户提供全面的音乐制作功能之外,还有丰富的主题和皮肤供用户选择,让用户不但做出的音乐具有自己的风格,连制作的音乐的过程也个性十足,非常适合…...
浅析如何写出高质量代码
你是否曾经为自己写的代码而感到懊恼?你是否想过如何才能写出高质量代码?那就不要错过这个话题!在这里,我们可以讨论什么是高质量代码,如何写出高质量代码等问题。无论你是初学者还是资深开发人员,都可以在…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...

AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...
Windows 下端口占用排查与释放全攻略
Windows 下端口占用排查与释放全攻略 在开发和运维过程中,经常会遇到端口被占用的问题(如 8080、3306 等常用端口)。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口,帮助你高效解决此类问题。 一、准…...

关于 ffmpeg设置摄像头报错“Could not set video options” 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/148515355 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...