next_permutation算法(基于交换)
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算法(基于交换)相关推荐
- 基于交换芯片的五元组的PCL规则过滤功能
2019独角兽企业重金招聘Python工程师标准>>> 基于交换芯片的五元组的PCL规则过滤功能作者: 韩大卫@吉林师范大学2012.12.10Not Approved by Doc ...
- 基于交换芯片的五元组过滤功能
基于交换芯片的五元组的PCL规则过滤功能作者: 韩大卫@吉林师范大学2012.12.10Not Approved by Document Control Review Copy Only基于Marve ...
- 基于交换技术的网络中,全双工主要运行在?( 内有答案与详解)
基于交换技术的网络中,全双工主要运行在?( ) A. 站点与站点之间 B. 交换机与服务器之间 C. 站点与服务器之间 D. 站点与交换机之间 答案: b 网站就是站点的意思,交换机实际是与数据打交道 ...
- [笔记]C#基础入门(五)——算法:交换
交换2个变量的值,就如同交换两只杯子中的饮料:一杯满满的牛奶和一杯满满的咖啡,怎样才能互换呢? 变量的交换也如此.两个变量的交换也需要一只"空杯子",就是中间变量: 1 strin ...
- 推荐系统 --- 推荐算法 --- 基于用户行为的推荐算法 - 协同过滤算法
概述 历史 1992年,Goldberg.Nicols.Oki及Terry提出 基本思想 爱好相似的用户喜欢的东西可能也会喜欢 优点 共享朋友的经验,提高推荐的准确度 根据爱好相似的用户喜欢的视频进行 ...
- 计算机视觉算法——基于Transformer的目标检测(DETR / Deformable DETR / DETR 3D)
计算机视觉算法--基于Transformer的目标检测(DETR / Deformable DETR / DETR 3D) 计算机视觉算法--基于Transformer的目标检测(DETR / Def ...
- 计算机视觉算法——基于Anchor Free的目标检测网络总结
计算机视觉算法--基于Anchor Free的目标检测网络总结 计算机视觉算法--基于Anchor Free的目标检测网络总结 1. CornerNet 1.1 关键知识点--网络结构及特点 1.2 ...
- 麦克风阵列定位matlab算法,基于麦克风阵列的MUSIC声源定位算法研究
摘要: 作为阵列信号处理领域的一个分支,麦克风阵列已广泛应用于电视会议.语音增强及识别等方面.声源定位是麦克风阵列进行空间滤波的重要基础,近年来发展迅速.基于阵列的定位算法可以分为超分辨算法和非超分辨 ...
- 聚类优化算法——基于Kmeans算法
聚类优化算法--基于Kmeans算法 Kmeans算法 Kmeans算法的基本原理及计算流程见上文--Kmeans算法及简单案例 Kmeans算法的优缺点 优点 - 原理简单(靠近中心点),实现容易 ...
- 协同过滤算法概述与python 实现协同过滤算法基于内容(usr-item,item-item)
协调过滤推荐概述 协同过滤(Collaborative Filtering)作为推荐算法中最经典的类型,包括在线的协同和离线的过滤两部分.所谓在线协同,就是通过在线数据找到用户可能喜欢的物品,而离线过 ...
最新文章
- SVD与PCA的区别
- Java虚拟机规范(目录)
- pip安装报错:'ascii'码不能解码,安装路径有中文
- mysql如何查看事务日记_MySQL日志查看详解
- 2015年最值得学习的编程语言是?
- 【每周CV论文】深度学习图像降噪应该从阅读哪些文章开始
- mysql 允许远程_配置mysql允许远程连接的方法
- boost::geometry::correct_closure用法的测试程序
- 深度学习(参数选择)
- flex布局,属性用法
- 为什么判断list的时候,既要判断不等于null有要判断size大于0
- 盘点抖音及今日头条的优化推广方法有哪些?
- 斐波那契 —— 矩阵形式推导
- 计算机控制实验 实验十,自控计控原理实验箱
- WIN10 edge浏览器阻止文件下载解决方法
- 高斯滤波 python
- 分享一个微信公众号管理平台源码
- 转发电子通信类期刊投稿攻略
- 网易云精选评论,总有一句戳在你心里
- 1003.Crashing Balloon