数据结构与算法——递归、回溯与分治

文章目录

        • 1.预备知识
          • 1.1 递归
          • 1.2 回溯
          • 1.3 位运算
        • 2.子集
          • 2.1 题目描述
          • 2.2 解题思路——回溯递归法
          • 2.3 C++实现
          • 2.4 解题思路——位运算法
          • 2.5 位运算实现
        • 3.子集 II
          • 3.1 题目描述
          • 3.2 解题思路
          • 3.3 回溯递归法——C++实现
          • 3.4 位运算——C++实现
        • 4.组合总和 II
          • 4.1 题目描述
          • 4.2 解题思路
          • 4.3 C++实现
        • 5.括号生成
          • 5.1 题目描述
          • 5.2 解题思路
          • 5.3 C++实现
        • 6.N 皇后
          • 6.1 题目描述
          • 6.2 棋盘和皇后表示
          • 6.3 回溯算法
          • 6.4 C++实现
        • 7.
          • 7.1 预备知识
          • 7.2 题目描述
          • 7.3 C++实现

1.预备知识

1.1 递归

在这里插入图片描述

1.2 回溯

在这里插入图片描述

1.3 位运算

在这里插入图片描述

2.子集

2.1 题目描述

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集

2.2 解题思路——回溯递归法

在这里插入图片描述

2.3 C++实现
class Solution {
public:vector<vector<int>> subsets(vector<int>& nums) {vector<int> item;vector<vector<int>> result;result.push_back(item);generate(0,nums,item,result);return result;}
private:void generate(int i,vector<int>& nums,vector<int>& item,vector<vector<int>>& result){if(i>=nums.size()){return;}item.push_back(nums[i]);result.push_back(item);generate(i+1,nums,item,result);item.pop_back();generate(i+1,nums,item,result);}
};
2.4 解题思路——位运算法

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

2.5 位运算实现
class Solution {
public:vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>> result;//int all_set=pow(2,nums.size());int all_set=1<<nums.size();for(int i=0;i<all_set;i++){vector<int> item;for(int j=0;j<nums.size();j++){if(i&(1<<j)){item.push_back(nums[j]);}}result.push_back(item);}return result;}};

3.子集 II

3.1 题目描述

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

3.2 解题思路

在这里插入图片描述
在这里插入图片描述

3.3 回溯递归法——C++实现
class Solution {
public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {vector<int> item;vector<vector<int>> result;set<vector<int>> res_set;sort(nums.begin(),nums.end());result.push_back(item);generate(0,nums,item,result,res_set);return result;}
private:void generate(int i,vector<int>& nums,vector<int>& item,vector<vector<int>>& result,set<vector<int>>& res_set){if(i>=nums.size()){return;}item.push_back(nums[i]);if(res_set.find(item)==res_set.end()){result.push_back(item);res_set.insert(item);}generate(i+1,nums,item,result,res_set);item.pop_back();generate(i+1,nums,item,result,res_set);}
};
3.4 位运算——C++实现
class Solution {
public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {int all_set;vector<vector<int>> result;set<vector<int>> res_set;sort(nums.begin(),nums.end());all_set=1<<nums.size();for(int i=0;i<all_set;i++){vector<int> item;for(int j=0;j<nums.size();j++){if(i&(1<<j)){item.push_back(nums[j]);}}if(res_set.find(item)==res_set.end()){result.push_back(item);res_set.insert(item);                    }}return result;}
};

4.组合总和 II

4.1 题目描述

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用一次。

所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。

4.2 解题思路

在这里插入图片描述

4.3 C++实现
class Solution {
public:vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {vector<int> item;vector<vector<int>> result;set<vector<int>> res_set;sort(candidates.begin(),candidates.end());generate(0,candidates,item,result,res_set,0,target);return result;}
private:void generate(int i,vector<int>& candidates,vector<int>& item,vector<vector<int>>& result,set<vector<int>>& res_set,int sum,                          int target){if(i>=candidates.size()||sum>target){return;}sum+=candidates[i];item.push_back(candidates[i]);if(sum==target&&res_set.find(item)==res_set.end()){result.push_back(item);res_set.insert(item);}generate(i+1,candidates,item,result,res_set,sum,target);sum-=candidates[i];item.pop_back();generate(i+1,candidates,item,result,res_set,sum,target);}
};

5.括号生成

5.1 题目描述

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

5.2 解题思路

在这里插入图片描述

输出所有组合
在这里插入图片描述

5.3 C++实现
class Solution {
public:vector<string> generateParenthesis(int n) {vector<string> result;generate("",n,n,result);return result;}
private:void generate(string item,int left,int right,vector<string>& result){if(left==0&&right==0){result.push_back(item);return;}if(left>0){generate(item+'(',left-1,right,result);}if(left<right){generate(item+')',left,right-1,result);}}
};

6.N 皇后

6.1 题目描述

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

1 <= n <= 9
皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。

6.2 棋盘和皇后表示

在这里插入图片描述
在这里插入图片描述

6.3 回溯算法

在这里插入图片描述
在这里插入图片描述

6.4 C++实现
class Solution {
public:vector<vector<string>> solveNQueens(int n) {vector<vector<string>> result;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,'.');}generate(0,n,location,result,mark);return result;}
private:void put_down_the_queen(int x,int y,vector<vector<int>>&mark){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;int new_x,new_y;for(int i=1;i<mark.size();i++){for(int j=0;j<8;j++){new_x=x+i*dx[j];new_y=y+i*dy[j];if(new_x>=0&&new_x<mark.size()&&new_y>=0&&new_y<mark.size()){mark[new_x][new_y]=1;}}}}void generate(int k,int n,vector<string> &location,vector<vector<string>> &result,vector<vector<int>> &mark){if(k==n){result.push_back(location);return;}for(int i=0;i<n;i++){if(mark[k][i]==0){vector<vector<int>> tmp_mark=mark;location[k][i]='Q';put_down_the_queen(k,i,mark);generate(k+1,n,location,result,mark);mark=tmp_mark;location[k][i]='.';}}} 
};

7.

7.1 预备知识

在这里插入图片描述

#include<vector>void merge_sort_two_vec(vector<int> &sub_vec1,vector<int> &sub_vec2,vector<int> &vec){int i=0,j=0;while(i<sub_vec1.size()&&j<sub_vec2.size()){if(sub_vec1[i]<=sub_vec2[j]){vec.push_back(sub_vec1[i]);i++;}   else{vec.push_back(sub_vec2[j]);j++;}   }   for(;i<sub_vec1.size();i++){vec.push_back(sub_vec1[i]);}   for(;j<sub_vec2.size();j++){vec.push_back(sub_vec2[j]);}   }

在这里插入图片描述在这里插入图片描述

7.2 题目描述

给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。

输入:nums = [5,2,6,1]
输出:[2,1,1,0]
解释:
5 的右侧有 2 个更小的元素 (2 和 1)
2 的右侧仅有 1 个更小的元素 (1)
6 的右侧有 1 个更小的元素 (1)
1 的右侧有 0 个更小的元素

7.3 C++实现

代码实现

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

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

相关文章

MongoDB安装启动教程

MongoDB安装启动教程 简易教程&#xff1a;鉴于第一次大家使用分布式数据库&#xff0c;提供一个简易教程&#xff08;也可看老师的PPT或者视频&#xff09; 1.点击安装包&#xff08;老师给的&#xff09;&#xff0c;安装目录不要更改&#xff0c;否则后面配置需要改&#xf…

机器能思考吗?

来源&#xff1a;人机与认知实验室机器有智能吗&#xff1f;机器会理解吗&#xff1f;机器能思考吗&#xff1f;从十七世纪到今&#xff0c;每一次机器功能的重大突破&#xff0c;这问题都被翻出来问一遍&#xff0c;只是否定它变得愈来愈困难了。Alpha Go与李世石的围棋赛尘埃…

数据结构与算法——二叉树与图

文章目录1.预备知识1.1 二叉树定义1.2 二叉树的构造2.路径总和 II2.1 题目描述2.2 算法思路2.3 C实现3.二叉树的最近公共祖先3.1 题目描述3.2 解题思路3.3 C实现4.二叉树展开为链表4.1 题目描述4.2 思考4.3 C实现4.4 解法二4.5 C实现5.二叉树的右视图5.1 预备知识5.2 题目描述5…

Nature评论:机器学习的物理启示录——隔壁的另一条机遇之道

来源&#xff1a;AI科技评论作者&#xff1a;Don编辑&#xff1a;青暮老话说&#xff1a;隔行不取利。但时过境迁&#xff0c;目前不管是娱乐圈还是学术界&#xff0c;跨界方可大红大紫。在娱乐圈&#xff0c;相声演员客串脱口秀&#xff0c;歌手跨界演员&#xff0c;赚的钵满盆…

操作系统——文件的逻辑结构

文章目录1.文件的逻辑结构的概念1.1 按照逻辑结构的文件分类1.2 无结构文件和有结构文件的区别2 顺序文件3 索引文件4.索引顺序表1.文件的逻辑结构的概念 1.1 按照逻辑结构的文件分类 1.2 无结构文件和有结构文件的区别 2 顺序文件 3 索引文件 4.索引顺序表

操作系统——文件目录

文章目录1.文件目录知识点2. 文件分配方式3.文件的存储空间管理4.文件的基本操作5.文件共享6.文件保护7.文件系统的层次结构1.文件目录知识点 2. 文件分配方式 3.文件的存储空间管理 4.文件的基本操作 5.文件共享 6.文件保护 7.文件系统的层次结构

我们不知道答案的125个科学问题(16)群体合作行为的演化

来源&#xff1a;张林科学网博客链接地址&#xff1a;http://blog.sciencenet.cn/blog-318012-1292142.html题记&#xff1a;离Science杂志提出125个问题到今天已经过去了16个年头&#xff0c;然而我这个125个问题的系列解读仅仅进行到第16个&#xff0c;想必这125个问题自己也…

Nature:大脑空间导航研究五十年

来源&#xff1a;集智俱乐部作者&#xff1a;Isabel I. C. Low & Lisa M. Giocomo译者&#xff1a;赵雨亭 审校&#xff1a;张澳 编辑&#xff1a;邓一雪 导语老马识途的故事被人们所熟知&#xff0c;但其识途的神经机制却尚待研究。1971年&#xff0c;研究人员首次发现&am…

操作系统——磁盘

文章目录1.磁盘的结构2.磁盘调度算法3.减少磁盘延时时间的方法4.磁盘管理1.磁盘的结构 2.磁盘调度算法 3.减少磁盘延时时间的方法 4.磁盘管理

建网站如何选择好用的网站源码程序

很多新手朋友第一次建网站时候&#xff0c;如何选择一款适合的网站源码是比较困惑的问题&#xff0c;选择一款好的网站源码可以节约大量时间和金钱&#xff0c;但是由于网站源码参差不齐&#xff0c;免费的&#xff0c;收费的&#xff0c;淘宝几元钱购买的&#xff0c;几万块钱…

操作系统——设备管理

文章目录1.I/O设备的基本概念与分类2.I/O控制器3.I/O控制方式4.I/O软件层次结构5.I/O核心子系统6.假脱机技术7.设备的分配和回收8.缓冲区管理1.I/O设备的基本概念与分类 2.I/O控制器 3.I/O控制方式 4.I/O软件层次结构 5.I/O核心子系统 6.假脱机技术 7.设备的分配和回收 8.缓冲区…

95页重磅报告:全面预测未来5年趋势

来源&#xff1a;中产财富分水岭将成为未来5年中国互联网的关键词&#xff0c;从浅水区向深水区过渡&#xff0c;引发竞争格局的强弱式转化。分水岭期不存在直道竞争&#xff0c;冷静和变化成为主旋律。版权申明&#xff1a;内容来源网络&#xff0c;版权归原创者所有。除非无法…

新发现为类脑计算机开辟了道路

来源&#xff1a;ScienceAI编辑&#xff1a;萝卜皮大型自旋霍尔纳米振荡器&#xff08;SHNO&#xff09;阵列的同步&#xff0c;是实现超快非常规计算的一种有吸引力的方法。然而&#xff0c;与阵列接口、调整其单个振荡器和提供内置存储器单元仍然存在巨大的难题。瑞典哥德堡大…

互联网大脑如何产生“梦境“并形成元宇宙

作者&#xff1a;刘锋本文摘录自2019年中信出版社出版的《崛起的超级智能&#xff0c;互联网大脑如何影响科技未来》的第二章“10条规则&#xff1a;互联网大脑如何影响科技企业的命运”中的“第九条规则&#xff0c;互联网大脑梦境的构建带来产业升级”。这一节详细阐述了互联…

2022年人工智能领域发展七大趋势

来源&#xff1a;科技日报编辑&#xff1a;蒲蒲美国《福布斯》网站在近日的报道中指出&#xff0c;尽管目前很难想象机器自主决策所产生的影响&#xff0c;但可以肯定的是&#xff0c;当时光的车轮到达2022年时&#xff0c;人工智能领域新的突破和发展将继续拓宽我们的想象边界…

数据库基础知识——DQL语言(一)

文章目录1.基础查询2.条件查询3.排序查询4.常见函数4.1 单行函数4.1.1 字符函数4.1.2 数学函数4.1.3 日期函数4.1.4 流程控制函数4.1.5 其他函数4.2 分组函数/统计函数/聚合函数5.分组查询1.基础查询 语法&#xff1a; SELECT 要查询的东西 【FROM 表名】;#查询employees表中所…

周志华教授发表首届国际学习与推理联合大会IJCLR开场Keynote:探索从纯学习到学习+推理的AI...

周志华&#xff0c;毕业于南京大学&#xff0c;欧洲科学院外籍院士&#xff0c;国家杰出青年基金获得者&#xff0c;现任南京大学人工智能学院院长、南京大学计算机软件新技术国家重点实验室常务副主任、机器学习与数据挖掘研究所 (LAMDA)所长、人工智能教研室主任。2021年8月1…

第八章 指针实验

C程序实验报告 实验项目&#xff1a; 1、指针基础及指针运算 2、数据交换 3、字符串反转及字符串连接 4、数组元素奇偶排列 姓名&#xff1a;曹时仙 实验地点&#xff1a;教学楼514教室 实验时间&#xff1a;2019.6.12 一、实验目的与要求 1、掌握指针的概念和定义方法 2、掌…

大脑的学习方式如何,机器学习与生物学习的联系将提供「答案」

来源&#xff1a;ScienceAI编辑&#xff1a;凯霞准确指出神经活动如何随着学习而变化&#xff0c;不是黑白分明的。有人认为大脑中的学习或生物学习可以从优化的角度来考虑&#xff0c;这就是在计算机或机器人等人工网络中学习的方式。由卡内基梅隆大学和匹兹堡大学的研究人员共…

登顶Nature | DeepMind用AI首次实现数学领域重大进展,助力科学家证实两大猜想

来源&#xff1a;AI科技评论作者&#xff1a;杏花、莓酊编辑&#xff1a;琰琰数论是人类知识最古老的一个分支&#xff0c;然而它最深奥的秘密与其最平凡的真理是密切相连的。数学原理极易从事实中归纳出来&#xff0c;但证明却隐藏的极深。可以说数学&#xff0c;是一切科学的…