【天天热闻】重复数字全排列的全新去重思想(非循环)C语言
本文介绍一种求有重复数字的全排列的去重思想,该算法思想在时间上优于目前使用最广泛的循环去重思想。
本文介绍一种求有重复数字的全排列的去重思想,该算法思想在时间上优于目前使用最广泛的循环去重思想。
参考题目:Acwing—递归实现排列型枚举II
(相关资料图)
参考题目:Leetcode—全排列II
因力扣的提交格式复杂,在这里用Acwing的题目做演示。
若想了解该种思想,就要先知道什么是函数栈帧。
顾名思义,函数与栈和帧的结合,每调用一个函数就会在栈区上开辟一块空间,就像视频的每一帧一样,当函数调用结束后,这一帧也会随之销毁,在栈区开辟的空间也会还给操作系统。
如果我们在函数内部创建一个数组的话,每调用一次函数,就会创建一次这个数组,该数组只会保存在当前帧里,当函数调用结束,空间没了,这个数组自然也就没了。
f(int time){int st[10];f(time + 1);}int main(){fun(1);return 0;}
如果你运行上面的代码,就会出现下面这样的情况:
由于函数的每一帧都在栈区内保存,所以后面的帧销毁之前,前面的帧内创建的st数组会一直保存,本文要介绍的思想就利用了函数栈帧的该种性质。
这里先展示代码,随后进行详细解读。
全局变量与主函数(与正常全排列无区别)
int N = 0;int data[10];int arr[10];int used[10];//...int main(){scanf("%d", &N);int i = 0;for (i = 0; i < N; i++){scanf("%d", &data[i]);}dfs(0);//递归用的函数return 0;}
其中,N是数据的个数,data是保存数据的数组,arr是递归时保存每一帧状态的,used是记录某个数字是否被用过,这些变量与正常的全排列代码中的意义相同。
函数
为了观看方便,将用图片展示,与正常全排列代码不同之处已用红色标出。
在本题中,step代表当前要排列的位置的下标,若想去重,就要保证每个数在每个位置上只出现一次,同时还不能影响其他分支。
因此,我们在函数内部创建数组st,用来保存当前位置下有哪些数被用过了,被用过了就跳过这个数即可。
拿数据data10={1,1,3}举例,第一个位置首先赋值为data0,同时让st[data0]+=1,表示在第一个位置data0已经用过了,当第一个位置为data0的分支全部结束后,就会把第一个位置赋为data1,但此时data0和data1相同,即st[data1]和st[data0]相同,都等于1,这样就把这第二个1给跳过了。
当我们进入到下一个位置时,又会创建一个新的st数组来保存当前位置的使用记录,这样前面的st数组既不会影响到后面的,也不会被后面的st数组覆盖,就能达到去重的效果。
博主一开始并没有想到用函数栈帧的性质,而是创建一个10X10的全局数组,让每一行代表每个step(每个位置),每一列代表每个数,哪个位置的哪个数被用了,就让其自增1。
这样不就相当于有了十个一维数组,每个一位数组都代表每个位置的数,不也可以达成上文讲述的效果吗?
但是这样却忘记了一件事,数组的记录不能影响其他的分支,拿{1,1,3}举例。
下面将展示两张图,其中step代表位置,从上到下代表选择,每一个紫色框代表一帧
以上两张图便是一正确、一错误的两种方法最直观地解释了。
若是题目没有要求按照字典序输出,则这种思想与循环思想相比,最大的优势是不需要排序,节约了排序消耗的时间,降低了代码的复杂程度。
一般这种全排列题目,给定的N不会太大,所以排序的时间其实也很短,主要是降低了代码的复杂程度。
其次,即使题目要求按照字典序输出,该思想在时间上依然优于循环思想,Acwing上两种代码各提交十次去掉极值后取平均值,比循环思想快约20ms,几乎可以忽略不计。
由此得出:
题目不要求字典序——优先选用本文介绍的思想题目要求字典序——两者皆可,差别不大下面展示Acwing的通过代码
#include#includeint n=0;int arr[10];int data[10];int used[10];f(int step){ int st[10]={0}; if(step==n) { int i=0; for(i=0;i
感谢您的阅读与耐心~ 如有错误烦请指出~ 谢谢~
关键词: 编程算法
[ 相关文章 ]
本文介绍一种求有重复数字的全排列的去重思想,该算法思想在时间上优于目前使用最广泛的循环去重思想。
筑梦新时代踔厉新征程时光不语,镌刻不凡。回眸2022年,众志成城、争分夺秒促重振。展望2023年,万丈豪情、千帆竞发抢开局。今年,是全面贯彻
为什么商业服务广告创意文案可以“英语口语”媒介星软文推广平台(南昌牛推科技)软文发布系统是一个承接事业单位、中小企业、个人等软文代写,
一、报名方法(1)本人现场报名。现场报名填写《东莞市社区卫生服务中心招聘纳入岗位管理的编制外人员报名表》(黑钢笔填写或打印,点击下载)一份
国家统计局网站消息,2023年1月份,全国工业生产者出厂价格同比下降0 8%,环比下降0 4%;工业生产者购进价格同比上
长期获利的核心是“亏小赚大”,如何做到亏小赚大,就需要在决定方向的关键位置去开仓。这样就可以把止损控制在最小。用最小的止损博取最大的
错误500是什么意思,说明IIS服务器无法解析ASP代码,访问一下静态页面看是否也出现这个问题,如果访问静态页面没问题,就要分以下几种情况来分
1、头发几天洗一次最好,要看具体情况。2、一般洗头不能太频繁。3、很容易洗掉皮脂腺分泌的皮脂,失去对头皮的保护作用。4、
周岁小朋友喜欢的礼品,周岁小朋友喜欢什么礼物,不过还是要送一些比较有创意的礼物,比较喜欢学习的礼物,有一些新奇的小礼物,
怎么更新显示适配器驱动,右击选项开始菜单图标,点击打开设备管理器选项,点击打开显示适配器,右击显卡驱动选项,点击选择更新驱动软件完成驱
“十大举措”服务稳外贸,2022年出口退(免)税超330亿元政策服务加持,外贸企业“乘风出海”□南京日报 紫金山新闻记者黄琳燕通讯员宁穗新春
1、举例如下:企业所得税采取按期预缴、年终汇算清激的办法。2、预缴的计算方法有两种:一、按本年一个月或一个季度实际的
现在很多人喜欢在淘宝上买东西,也有很多人讨厌在淘宝上买东西。淘宝为什么这么便宜?如何进入淘宝特卖,今天就给大家介绍一下。淘宝入口在哪
解答:1、现在是第一季2018年4月8日。103010是吉林卫视打造的国内首档众星云集的家庭综艺真人秀节目。它以‘家庭’
布雷特·道顿个人资料中文名:布雷特·道顿外文名:BrettDalton国籍:美国出生地:圣何塞,加利福尼亚州出生日期:
1、方法和详细的操作步骤如下:第一步,打开金蝶KIS标准版的主界面,然后单击“文件”选项,见下图,转到下面的步骤。2、2
大家好,关于佟丽娅和陈思诚离婚的真实原因,陈思诚秘会两女事件的相关信息很多小伙伴还不太了解,小灵整理了相关内容来分享给大家,让我们一
新海南客户端、南海网、南国都市报2月9日消息(记者王小畅通讯员陈立智)自1月7日春运启动以来,截至2月8日,琼州海峡累计客滚船进出港8716艘
送奶奶的小礼物有挺多,你可以送个特别的礼品。分享一波平价的,有什么靠谱礼物可以满足他们呢。选有贴心的东东吧,也担心奶奶觉
为什么说有些人是被上天选中的人呢?因为他们的命运注定是不平凡的,他们和普遍人是不一样的,他们会有一些不一样的经历。二而如
[ 相关新闻 ]
Copyright 2015-2022 大众医院网 版权所有 备案号:豫ICP备20014643号-14 联系邮箱: 905 14 41 07@qq.com