当前位置: 首页 > news >正文

递归,回溯,分治(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++刷题笔记)

递归&#xff0c;回溯&#xff0c;分治&#xff08;C刷题笔记&#xff09; 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这篇文章&#xff0c;https://mirrors.tuna.tsinghua.edu.cn/help/centos/是清华大学官网教程。 /etc/yum.repos.d/CentOS-Base.repo文件如下&#xff1a; #…...

三、进度管理

3、 [单选] 一个项目实施团队需要满足一份非常严格的进度计划。相对于已完成的事项&#xff0c;这样会导致正在进行的工作超过负荷。为了解决这个问题&#xff0c;项目经理需要获得额外的资源。项目经理应该向发起人提供什么理由来支持追加资源的请求&#xff1f; A project im…...

基于LEACH和HEED的WSN路由协议研究与改进(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 无线传感器网络是不断发展的传感技术之一&#xff0c;也用于执行不同的任务。这些类型的网络在许多领域都是有益的&#xff0c…...

ChatGPT镜像站收集【Free ChatGPT】(一)

文章目录 Free ChatGPT Site ListLast synced:BeiJingT 2023-04-18妙站站点列表Free ChatGPT Site List 这儿收集了一些免费好用的ChatGPT镜像站点 ⭐:使用不受限🔑:需要进行登录⛔:有限地使用次数后需提供key或进行充值❓ :未测试,未进行标注也为未测试Last synced:BeiJin…...

PHP面试宝典之Mysql数据库基础篇

字符类型&#xff1a; tinyint(4)&#xff1a;占1个字节&#xff0c;4代表字段值长度&#xff0c;用0填充&#xff0c;搭配zero fill使用 有符号&#xff1a;取值范围 负128 &#xff5e; 正127&#xff1b; 无符号&#xff1a;取值范围 0 &#xff5e; 255&#xff1b; 默认无…...

4月记录总结

4/24 1.GBK12、16、24是指什么 GBK12、GBK16、GBK24是指不同的字体点阵大小&#xff0c;也就是字体的显示大小。在GBK编码中&#xff0c;一个汉字通常是由多个点阵组成的&#xff0c;其中点阵的大小就是字体的点阵大小。具体来说&#xff1a; GBK12&#xff1a;指每个汉字由12…...

每日学术速递4.29

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

整数在内存中的存储:原码、反码、补码 大小端字节序

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

【方法】 如何批量将RAR或其他压缩格式转换成ZIP?

压缩文件的格式有很多种&#xff0c;比如RAR、ZIP、7-Zip、CAB、ARJ、ACE、TAR、BZ2等等。因为需求不同&#xff0c;或者不同平台对上传的压缩包格式要求不同&#xff0c;我们往往需要把压缩文件进行格式转换&#xff0c;那压缩文件不同格式之间如何进行转换呢&#xff1f; 如…...

《道德经》

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

ABI Research产业研究:ZiFiSense如何革新物流货物及运输包装追踪

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

家乡特色推荐系统~java~mysql

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

二维码在设备点维一体化管理中的应用

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

基于simulink使用混合波束成形对射频毫米波发射器进行建模

一、前言 本例说明了一种使用66元件混合波束成形天线对32 GHz QPSK射频发射和接收系统进行系统级建模和仿真的方法。该系统包括射频缺陷、发射阵列辐射效应、窄带接收阵列和基带接收器&#xff0c;可校正系统损伤和消息解码。天线波束形成方向使用方位角和仰角定义&#xff0c;…...

面试官:v-model原理?

什么是v-model v-model是Vue框架中的一个指令&#xff0c;用来实现双向数据绑定。它能够在表单元素&#xff08;如输入框、复选框等&#xff09;和Vue实例中的数据属性之间建立起一条双向数据通道&#xff0c;使得当表单元素的值发生改变时&#xff0c;对应的数据属性也会相应…...

兰林:科技赋能健康产业 助力乡村振兴建设

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

小红书流量密码是什么,怎么掌握并运用

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

FL Studio 2023中文高级版水果编曲软件下载

FL Studio 2023中文版是一款非常经典的音乐制作软件&#xff0c;这款软件除了可以为用户提供全面的音乐制作功能之外&#xff0c;还有丰富的主题和皮肤供用户选择&#xff0c;让用户不但做出的音乐具有自己的风格&#xff0c;连制作的音乐的过程也个性十足&#xff0c;非常适合…...

浅析如何写出高质量代码

你是否曾经为自己写的代码而感到懊恼&#xff1f;你是否想过如何才能写出高质量代码&#xff1f;那就不要错过这个话题&#xff01;在这里&#xff0c;我们可以讨论什么是高质量代码&#xff0c;如何写出高质量代码等问题。无论你是初学者还是资深开发人员&#xff0c;都可以在…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...