nextpermutation 算法
这个算法如何实现 我们要观察对于任意的123456
对于一个任意的字符串
我们如果要找他的下一个全排列
就应该变动其数字 使得其数值增大 且是最小的增大
那么仅使用以上数字 如何才能使其变大 但变大的数字 是所有变大范围内最小的可能 我们称其为 最小变大

我们看 如果是 1234 下一个数 1243
再来 1243 下一个数是 1342
那么 1342 下一个数是 1423 > 1432
1432 > 2134

像4,43,432这种时候
就需要 把后面的一个数字和前面的一个数字更换
从而实现到最小变大 那么进一步地
我们发现 每次这种变化都是一个递减序列 (如 4,43,432)
把其中最小的数字 和4前面的数字交换 得到一个新序列
因为只有这样才能保证 我们得到新序列才是向“最小变大”

我们需要在后面的递减序列中找到一个比递减序列第一个元素前的
那个元素 我们姑且叫他第0号元素 我们找到一个比0号元素大的
且是最接近0号元素的数字 和 0号交换 才能实现“最小变大“

好了 那么 我们就有代码的思路了
我们发现 任何数串 都可以看成一个后面拖着一个递减序列的数串
无论是什么数字 后面总有一个递减序列 有的是一个元素,有的是多个元素

如何找到他下一个排列?我们要做的是
把递减序列前的第0元素 和递减序列中的比0号元素大且最接近的元素
他俩交换 这样才能实现变大 而且可以推得 递减序列中一定存在元素比第0号元素大

为什么呢? 因为若是不这样 0号元素就在非严格
递减序列里了 所以一定递减序列中有元素比他大
那么 交换完成后就完成任务了吗? 还不够
比如 1342  > 1432 >1423
        1      2     3

我们发现 还需要调整一下才能得到交换后的数串最小
如何调整? 就是要把交换后原来的递减序列从小到大排序才能使其最小
所以我们这里就知道了 由于交换后的0号元素新位置 本来就比0号大
所以仍旧是递减序列

那么就总结为这几个步骤

1 找出递减序列前的第0元素
2 找出递减序列中大于第0元素的最接近元素
3 交换两个元素
4 将0号元素后的序列从小到大排序

我们就得到了他的下一排列

模板例题:POJ-3785

题意:就是求下一个排列

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
char a[100];
bool Next(int s,int e){int l,j = e-1;while(j>0&&a[j]>=a[j+1])j--; //1if(j==0)return 0;//如果完全逆序 则不必交换 已经是最大可能了for(l = e;a[l]<=a[j];l--);//2swap(a[l],a[j]);//3reverse(a+j+1,a+e+1);//4return 1;
}
int main(){int n;scanf("%d",&n);while(n--){int num;scanf("%d %s",&num,a+1);int len = strlen(a+1);if(Next(1,len))printf("%d %s\n",num,a+1);else printf("%d BIGGEST\n",num);}return 0;
}

next_permutation算法(基于交换)相关推荐

  1. 基于交换芯片的五元组的PCL规则过滤功能

    2019独角兽企业重金招聘Python工程师标准>>> 基于交换芯片的五元组的PCL规则过滤功能作者: 韩大卫@吉林师范大学2012.12.10Not Approved by Doc ...

  2. 基于交换芯片的五元组过滤功能

    基于交换芯片的五元组的PCL规则过滤功能作者: 韩大卫@吉林师范大学2012.12.10Not Approved by Document Control Review Copy Only基于Marve ...

  3. 基于交换技术的网络中,全双工主要运行在?( 内有答案与详解)

    基于交换技术的网络中,全双工主要运行在?( ) A. 站点与站点之间 B. 交换机与服务器之间 C. 站点与服务器之间 D. 站点与交换机之间 答案: b 网站就是站点的意思,交换机实际是与数据打交道 ...

  4. [笔记]C#基础入门(五)——算法:交换

    交换2个变量的值,就如同交换两只杯子中的饮料:一杯满满的牛奶和一杯满满的咖啡,怎样才能互换呢? 变量的交换也如此.两个变量的交换也需要一只"空杯子",就是中间变量: 1 strin ...

  5. 推荐系统 --- 推荐算法 --- 基于用户行为的推荐算法 - 协同过滤算法

    概述 历史 1992年,Goldberg.Nicols.Oki及Terry提出 基本思想 爱好相似的用户喜欢的东西可能也会喜欢 优点 共享朋友的经验,提高推荐的准确度 根据爱好相似的用户喜欢的视频进行 ...

  6. 计算机视觉算法——基于Transformer的目标检测(DETR / Deformable DETR / DETR 3D)

    计算机视觉算法--基于Transformer的目标检测(DETR / Deformable DETR / DETR 3D) 计算机视觉算法--基于Transformer的目标检测(DETR / Def ...

  7. 计算机视觉算法——基于Anchor Free的目标检测网络总结

    计算机视觉算法--基于Anchor Free的目标检测网络总结 计算机视觉算法--基于Anchor Free的目标检测网络总结 1. CornerNet 1.1 关键知识点--网络结构及特点 1.2 ...

  8. 麦克风阵列定位matlab算法,基于麦克风阵列的MUSIC声源定位算法研究

    摘要: 作为阵列信号处理领域的一个分支,麦克风阵列已广泛应用于电视会议.语音增强及识别等方面.声源定位是麦克风阵列进行空间滤波的重要基础,近年来发展迅速.基于阵列的定位算法可以分为超分辨算法和非超分辨 ...

  9. 聚类优化算法——基于Kmeans算法

    聚类优化算法--基于Kmeans算法 Kmeans算法 Kmeans算法的基本原理及计算流程见上文--Kmeans算法及简单案例 Kmeans算法的优缺点 优点 - 原理简单(靠近中心点),实现容易 ...

  10. 协同过滤算法概述与python 实现协同过滤算法基于内容(usr-item,item-item)

    协调过滤推荐概述 协同过滤(Collaborative Filtering)作为推荐算法中最经典的类型,包括在线的协同和离线的过滤两部分.所谓在线协同,就是通过在线数据找到用户可能喜欢的物品,而离线过 ...

最新文章

  1. SVD与PCA的区别
  2. Java虚拟机规范(目录)
  3. pip安装报错:'ascii'码不能解码,安装路径有中文
  4. mysql如何查看事务日记_MySQL日志查看详解
  5. 2015年最值得学习的编程语言是?
  6. 【每周CV论文】深度学习图像降噪应该从阅读哪些文章开始
  7. mysql 允许远程_配置mysql允许远程连接的方法
  8. boost::geometry::correct_closure用法的测试程序
  9. 深度学习(参数选择)
  10. flex布局,属性用法
  11. 为什么判断list的时候,既要判断不等于null有要判断size大于0
  12. 盘点抖音及今日头条的优化推广方法有哪些?
  13. 斐波那契 —— 矩阵形式推导
  14. 计算机控制实验 实验十,自控计控原理实验箱
  15. WIN10 edge浏览器阻止文件下载解决方法
  16. 高斯滤波 python
  17. 分享一个微信公众号管理平台源码
  18. 转发电子通信类期刊投稿攻略
  19. 网易云精选评论,总有一句戳在你心里
  20. 1003.Crashing Balloon

热门文章

  1. Chapter 5 Exercises Problems
  2. 硬件描述语言复习笔记
  3. spring 实例化bean的几种方法
  4. 烙饼啊烙饼{转自ITEO
  5. Java 中的List动态转Map集合
  6. 07 | 链表(下):如何轻松写出正确的链表代码?
  7. android edittext禁止输入特殊字符,Android EditText禁止输入空格和特殊字符
  8. vue的watch监听
  9. 【C语言进阶深度学习记录】十四 C语言中 三目运算符和逗号表达式
  10. .NET Framework学习笔记(十)