首页 > 其他分享 >next_permutation讲解

next_permutation讲解

时间:2023-01-06 12:48:44浏览次数:27  
标签:排列 int 9237740 permutation 交换 next 讲解

原文链接 : https://blog.51cto.com/u_15067267/4403636?b=totalstatistic

 

求1~n的全排列,有两种方法,dfs和借助next_permutation()函数,这里我浅谈后者。

next_permutation()原型是bool next_permutation(iterator start,iterator end),在c++库<algorithm>中,既找数组的下一个排列,这里的数组可以是整型、字符型等。

代码实现1~3的全排列:

 

 1 #include <iostream>  
 2 #include <algorithm>  
 3 using namespace std;  
 4 int main()  
 5 {  
 6     int num[3]={1,2,3};  
 7     do  
 8     {  
 9         cout<<num[0]<<" "<<num[1]<<" "<<num[2]<<endl;  
10     }while(next_permutation(num,num+3));  
11     return 0;  
12 }

 

 

括号内的范围类似sort函数,sort(首地址,首地址+个数),考虑升降幂的话加一个cmp函数来判断。

这样直接用很简单,但是我想讲一讲手写next_permutaion.

核心就是:如何找下一个排列,规律为何?

清楚一点:每次next_permutation确定的下一个排列实则只交换了两个数,如原来是1234,下一个为1243,交换了4和3.

如9237740这个排列,下一个是谁?如何做交换?

核心:从后往前找,找一对递增的相邻数,如40不是递增,74也不是,37是,记这对递增数的前一个数3为关键数,从后面找比它大的数中的最小数4,做交换变为7247730,再将4后面做一次颠倒得到7240377,即9237740的下一个全排列数。

换一种理解,我们从后找发现7740是逆序,无法通过交换得到一个比原数大的数,往前走,37740非逆序,将3和4交换,变为47730,做一次翻转,得到9237740,正好是9237740的下一个排列数。

看代码吧:

 

 1 #include <iostream>  
 2 using namespace std;
 3 
 4 const int N = 20;
 5 int a[N];
 6 int n;
 7 
 8 void swap(int *a,int *b)
 9 {
10     int t = *a;
11     *a = *b;
12     *b = t;
13 }
14 
15 void reverse(int *a,int *b)
16 {
17     while (a<b) {
18         swap(a++,b--);
19     }
20 }
21 
22 bool next_per()
23 {
24     int *end = a + 1 + n; // 尾指针 
25     if (end == a + 1) return false; // n = 0 
26     end--;
27     int *p,*pp,*find;
28     p = end;// p从后往前遍历
29     while (p != a + 1) {  
30         pp = p; // pp为p右相邻指针 
31         p--;
32         if (*p < *pp) {// 相邻递增  
33             find = end; // 从后往前 找最小的大于*p的数  同时也是第一个大于*p 的数
34             while (*find <= *p)    find--;
35 
36             swap(p,find);// 交换  
37             reverse(pp,end); // 翻转 
38             return true; 
39         }
40     }
41     return false;
42 
43 }
44 
45 int main()
46 {
47     cin>>n;
48     for (int i = 1; i <= n;i++) {
49         a[i] = i;// 初始化
50     }
51     do{
52         for (int i = 1; i <= n; i++)
53         cout<<a[i];
54         cout<<"\n";
55     }while(next_per());
56 
57     return 0;
58 }

 

-----------------------------------
关于全排列--手写next_permutation()函数

标签:排列,int,9237740,permutation,交换,next,讲解
From: https://www.cnblogs.com/llihaotian666/p/17030104.html

相关文章

  • 肖sir__i/o流讲解
    目录:1、File类的作用2、I/O流的作用3、I/O流的分类============================1、File类对象可封装要操作的文件,可通过File类的对象对文件进行操作,如查看文件的大小......
  • 系统的讲解网站的优化
    网站优化是指通过改进网站的内容、架构、链接、用户体验、推广等方面来提高网站在搜索引擎中的排名。下面是一些常用的网站优化方法:网站的优化可以简单根据内外的分为几步......
  • 仿bbs项目之评论功能完善,后台管理功能部分讲解,bs4模块简介
    目录仿bbs项目之评论功能完善,后台管理功能部分讲解,bs4模块简介昨日内容回顾今日内容概要今日内容详细根评论完善后台管理添加文章仿bbs项目之评论功能完善,后台管理功能部......
  • Java中next() 、nextInt() 和 nextLine() 方法
    Scanner的几个常用next输入方法要点next():一直接收从键盘中打入的内容直到读取到回车,此回车并不会被读取,且一定要读取到有效字符后才可以结束输入。对输入有效字符之......
  • 日志框架之TLog讲解分析
    目录1TLog1.1引言1.2简介1.3TLog操作1.3.1pom.xml1.3.2替换logback配置项1.3.3测试1.4TLog接入方式1.5TLog的基本原理1.5.1日志标签1.5.2TLogContext1.5.3TLog......
  • bbs项目(部分讲解)
    文章评论业务完善提交评论 评论框里面的内容会清空然后页面会有一个临时评论样式出现页面刷新才会出现评论楼样式研究子评论特性 每个评论右侧都应该有回复按钮点......
  • nextjs中使用braft-editor,报错window is not defined
    braft-editor中使用了浏览器对象window等,在next中使用时会报windowisnotdefined相关错误解决方案:src/home/conponents/editor/index.jsimportReactfrom'react';......
  • unity4.6之UGUI之与代码结合及Text讲解
    UGUI与以往的NGUI不同之处很多其中一大特点就是UGUI把精灵图集的功能取消了。首先是我们看看UGUI的UI界面:其中有项是Text...也就是本节要讲的内容;说到text不得不说的是字......
  • 仿bbs之侧边栏功能补充,点赞点踩功能,文章详细数据(内容)准备,文章评论功能部分讲解
    目录仿bbs之侧边栏功能补充,点赞点踩功能,文章详细数据(内容)准备,文章评论功能部分讲解今日内容概要今日内容详细侧边栏筛选功能文章详情页搭建文章详细数据准备点赞点踩样式......
  • Zabbix 介绍及部署(超详细讲解)
    原文:https://mp.weixin.qq.com/s/7pDagRaWSG9dndHS1gWHBQ一、[zabbix]的基本概述zabbix是一个监控软件,其可以监控各种网络参数,保证企业服务架构安全运营,同时支持灵活的......