当前位置: 首页 > 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;都可以在…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...