全排列(C++)

2024年6月16日1:48,正式开启每日一题~

题目要求:给定正整数n(n≥1),给出1~n的全排列,例如,当n=3时全排列是{{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}};

题解思路:归纳法+迭代法:将问题化小,探索规律。

1. 对于n=1时,1的全排列为{{1}};

2. 对于n=2时,2的全排列为{{1,2},{2,1}};

3. 对于n=3时,3的全排列为{{3,1,2},{1,3,2},{2,1,3}};

……

发现规律了吗?

当n=2时,2的全排列是不是在n=1的全排列基础上在1的左边和右边添加了数字2呢?

当n=3时,3的全排列是不是在n=2的全排列基础上在数字1和2的左中右添加数字3呢?

代码思路:

1. 将1作为结果的起点,直接初始化为{{1}},如果n=1则直接输出即可,否则进入循环体;

2. 根据上面的思路,每次更新都需要取上一次的结果,并且对于结果中的每一个值都需要遍历,比如n=2时,我们需要依次取出{1,2}和{2,1}分别做插入3的操作;

注意:利用insert插入会改变原始值,需要利用中间变量保存。

请根据这个思路利用代码实现一下吧!

方法一:非递归方式

vector<vector<int>> getFullPermutation(int n){
    if(n < 1){
        return {{}};
    }
    vector<vector<int>> res = {{1}};
    if(n == 1){
        return res;
    }
    for(int i = 2; i <= n; i++){
        vector<vector<int>> tmp;//每次循环初始化tmp用来保存当前的最终结果
        for(auto e:res){
            for(int j = 0; j <= e.size(); j++){
                vector<int> tmp1 = e;//这里是用来避免insert改变原始值,导致下次插入结果不正确
                auto it = tmp1.begin() + j;
                tmp1.insert(it, i);
                tmp.push_back(tmp1);
            }
        }
        res = tmp;
    }
    return res;
}

方式二:递归方式

vector<vector<int>> getFullPermutation(vector<vector<int>> res, int n){
    if(n < 1){
        return {{}};
    }
    if(n == 1){
        return {{1}};
    }
    res = getFullPermutation(res, n-1);
    vector<vector<int>> tmp;//用来记录结果
    for(auto e:res){
        for(int j = 0; j <= e.size(); j++){
            vector<int> tmp1 = e;
            auto it = tmp1.begin() + j;
            tmp1.insert(it, n);
            tmp.push_back(tmp1);
        }
    }
    return tmp;
}

注意:千万不要将tmp初始化为{{}},这并不是说明tmp中没有元素,它有!!!tmp的元素是vector容器,只是这个容器为空而已!

 本人已踩坑,找了好久都没有找出毛病,输出总是多一串,错误结果如下:

正确结果:


我这一生,要么光鲜亮丽,要么平庸至极!                             ——WXL

记录大学学习生活~ 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

命令行脚本批量转换工具说明

说明 通常使用NimbleText工具生成相应的脚本&#xff0c;然后使用Notepad保存脚本。 NimbleText&#xff1a;用于批量生成命令行脚本。官网链接&#xff1a;http://nimbletext.com/ Notepad&#xff1a;文本编辑器&#xff0c;保存配置脚本&#xff0c;保存成.txt格式&#…

编码规则UTF-8 和 UTF-16的区别

UTF-8 和 UTF-16 的设计背景与历史 为了更好地理解 UTF-8 和 UTF-16 的设计选择和背景&#xff0c;以下是两种编码方案的历史、设计动机和它们在计算机科学中的应用。 Unicode 的背景 在 Unicode 之前&#xff0c;不同的字符集和编码方案使得跨平台和国际化的文本处理变得复…

5G/4G/北斗遥测终端机全国各省水利平台无缝对接

物联网技术的广泛应用正在深刻影响水利行业&#xff0c;计讯物联致力于推动水利技术的持续革新和服务的持续升级&#xff0c;依托国家级专业水利资质认证&#xff0c;在多个大型水利项目中展现的项目管理专长&#xff0c;为水利项目建设提供了高效的解决方案&#xff0c;持续推…

掌握 NumPy:高效数组处理综合指南(第 2/2 部分)

照片由 兹比内克布里瓦尔 on Unsplash 一、介绍 欢迎来到我关于 NumPy 的教程的第二部分&#xff01;之前&#xff0c;我们已经介绍了以下列表中的前 7 章。现在在这篇文章中&#xff0c;我们将从第 8 章一直到第 14 章。 Numpy 安装数组初始化Numpy 数组限制计算速度和内存使用…

虹软ArcSoft—真正离线免费的人脸识别SDK

虹软ArcSoft—真正离线免费的人脸识别SDK 高级功能收费 还是很好滴 人证核验功能是C/C的SDK&#xff0c;需要封装为C#&#xff0c;然后暴露为Restful API使用

神经网络学习5-非线性激活

非线性激活&#xff0c;即 这是最常用的 inplaceTrue 原位操作 改变变量本身的值&#xff0c;就是是否输入时若原本有值&#xff0c;是否更换 该函数就是表示&#xff1a;输入小于零时输出0&#xff0c;大于零时保持不变 代码如下&#xff1a; import torch from torch imp…

【C语言】解决C语言报错:Stack Overflow

文章目录 简介什么是Stack OverflowStack Overflow的常见原因如何检测和调试Stack Overflow解决Stack Overflow的最佳实践详细实例解析示例1&#xff1a;递归调用过深示例2&#xff1a;分配过大的局部变量示例3&#xff1a;嵌套函数调用过多 进一步阅读和参考资料总结 简介 St…

速看!这个AI大模型有望让手机“进化”为专属私人助理

如何让AI技术与智能手机结合 把大模型装进手机 已经成为了各手机厂商 最重要的课题之一 11月1日&#xff0c;vivo在 2023 vivo开发者大会上 发布自研通用大模型矩阵—— 蓝心大模型 以及基于大模型打造的 蓝心小V、蓝心千询等 智能化产品 这也让vivo成为了 率先使用…

【计算机毕业设计】​206校园顺路代送微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

python如何判断图片是否为空

如下所示&#xff1a; import cv2im cv2.imread(2.jpg) if im is None:print("图像为空") # cv2.imshow("ss", im) # cv2.waitKey(0)

南卡、漫步者和Oladance开放式哪家强?无广避坑测评!

现在市面上的开放式耳机种类非常多&#xff0c;在购买的时候大多数人都没有非常确定的目标&#xff0c;这主要是因为大多数人对开放式耳机的认识程度不够。 作为一个有着多年数码产品测评经验的测评员&#xff0c;我刚好对开放式耳机也有比较深刻的理解&#xff0c;也借着大家…

VS编译器字体颜色设置

默认颜色不好看&#xff0c;颜色之间代码各个关系之间没有很强关联性所以要设置字体颜色 颜色一步到位版本&#xff1a; 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a;One dark Pro 第四步&#xff1a; 等待安装完后重启VS 点击Modify&#xff0c;一段时间结束后选…

五十四、openlayers官网示例LineString Arrows解析——在地图上绘制箭头

官网demo地址&#xff1a; LineString Arrows 这篇介绍了在地图上绘制箭头。 创建一个矢量数据源&#xff0c;将其绑定为draw的数据源并展示在矢量图层上。 const source new VectorSource();const vector new VectorLayer({source: source,style: styleFunction,});map.ad…

课程管理系统

摘 要 在大学里&#xff0c;课程管理是一件非常重要的工作&#xff0c;教学工作人员每天都要与海量的数据和信息打交道。确保数据的精确度和完整程度&#xff0c;影响着每一位同学的学习、生活和各种活动的正常展开&#xff0c;更合理的信息管理也为高校工作的正规化运行和规范…

Redis缓存穿透

缓存穿透&#xff1a; 查询一个不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致每次请求都查数据库。 方法一&#xff1a; 方法二&#xff1a; 布隆过滤器&#xff1a; 简单来说就是一个二进制数组&#xff0c;用0和1来判断数组中是否存在…

《技术人求职之道》之洞悉人事篇:揭秘简历筛选,千挑万选,简历如何脱颖而出

摘要 在上一节中&#xff0c;我们探讨了面试前的技术准备&#xff0c;而这一节&#xff0c;将深入探讨求职者在面对HR筛选简历时的策略与注意事项。本文将首先介绍HR的职责和绩效考核机制&#xff0c;揭示部分HR可能存在的"只招不聘"现象&#xff0c;并建议求职者应…

thinkphp5使用模型删除与复杂查询EXP

模型删除 应用软删除 表中需要有字段&#xff0c;deletetime 模型中使用下面方法 use SoftDelete;protected $deleteTime delete_time;真实删除 // 软删除 User::destroy(1); // 真实删除 User::destroy(1,true); $user User::get(1); // 软删除 $user->delete(); // 真…

Claude3.5:编码螃蟹游戏就是这么轻松

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则…

容器之滚动条窗体演示

代码; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);GtkWidget *window;window gtk_window_new(GTK_WINDO…

御龙掘宝挂机零撸修仙类游戏定制开发源码部署

随着移动游戏的普及&#xff0c;御龙掘宝挂机零撸修仙类游戏定制开发源码部署应运而生。这款游戏结合了传统的修仙元素、挂机游戏的核心玩法以及零撸掘金的商业模式&#xff0c;为玩家提供了一个全新的游戏体验。本文将探讨御龙掘宝挂机零撸修仙类游戏定制开发源码部署的核心技…