STL中next_permutation()和prev_permutation()函数实现_prev permutation 实现-程序员宅基地

技术标签: 算法  面试  STL  algorithm  

next_permutation()和permutation()是STL提供的用来计算下一个排列和上一个排列的算法;刷题中经常用到,比较有用。

next_permutation()实现

template <class iterator>
bool next_permutation(iterator first,iterator last)
{
    
    if(first==last)return false;
    iterator i=first;
    if(++i==last)return false;
    i=last;
    --i;
    for(;;)
    {
    
        iterator ii=i;
        --i;
        if(*i<*ii)
        {
    
            iterator j=last;
            while(!(*i<*--j));
            swap(*i,*j);
            reverse(ii,last);
            return true;
        }
        if(i==first)
        {
    
            reverse(first,last);
            return false;
        }
    }
}

prev_permutation()实现

template <class iterator>
bool prev_permutation(iterator first,iterator last)
{
    
    if(first==last)return false;
    iterator i=first;
    if(++i==last)return false;
    i=last;
    --i;
    for(;;)
    {
    
        iterator ii=i;
        --i;
        if(*i>*ii)
        {
    
            iterator j=last;
            while(!(*i>*--j));
            swap(*i,*j);
            reverse(ii,last);
            return true;
        }
        if(i==first)
        {
    
            reverse(first,last);
            return false;
        }
    }
}

测试:

int main() {
    
   vector<int>temp{
    1,2,3};
   while( ::next_permutation(temp.begin(),temp.end()))
   {
    
       for(auto &c:temp)
        cout<<c<<" ";
       cout<<endl;
   }
   temp={
    3,2,1};
   cout<<endl;
   while( ::prev_permutation(temp.begin(),temp.end()))
   {
    
       for(auto &c:temp)
        cout<<c<<" ";
       cout<<endl;
   }
    
    
    return 0;
}

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/you558/article/details/105744380

智能推荐

操作系统(四):动态链接与静态链接的区别_操作系统静态连接和动态连接的区分-程序员宅基地

在回答这个问题之前希望大家大概了解一个文件编译的过程,比如一个C文件在编译成功后文件夹里的文件会有什么变化,大家可以先去创建一个helloworld.c的文件,观察其编译后的变化。那么问题来了 面试官经常会问到动态链接和静态链接的区别,这到底是什么鬼,作为马上面试的小白如何快速理解这道题呢~ 不要急这道题我们要理解动态库和静态库区别,1,了解其文件命名格式静态库:linux下..._操作系统静态连接和动态连接的区分

解决eclipse中文字体太小的问题_eclipse 中文字符显示很小-程序员宅基地

解决方式有两种:一、把字体设置为Courier New 操作步骤:打开Elcipse,点击菜单栏上的“Windows”——点击“Preferences”——点击“Genneral”——点击“Appearance”——点击“Colors and Font”——在右侧框展开“Basic”文件夹--双击“Text Font”——在弹出窗选择“Courier New”(注:这里可能找不到“Cou_eclipse 中文字符显示很小

C#如何实现控件移动拖动-程序员宅基地

1 //在picturebox鼠标移动2 private void picBox_MouseMove(object sender, MouseEventArgs e)3 {4 if (MoveFlag)5 {6 picBox.Left += Convert.ToInt16(e.X - xPos);//设置x坐标.7 pic..._c# picbox 修改矩形

vsCode 快捷键-程序员宅基地

记住常用的快捷键,对开发来说,简直是行云流水,心里无比顺畅。按 Press功能 FunctionCtrl + Shift + P,F1显示命令面板 Show Command PaletteCtrl + P快速打开 Quick OpenCtrl + Shift + N新窗口/实例 New window/instanceCtr...

对调用第三方接口的监控策咯-程序员宅基地

有网友遇到问题: 有遇到这种情况怎么处理? CXF调用webservice接口,接口网络严重超时,已设置超时时间20秒,但是访问量一大造成本地服务假死,怎么去解决?还有如何屏蔽CXF的time out日志 一个思路: 可以做个接口调用情况监控 对于第三方的接口 做一个实时统计,对接口A 调用开始前 对redis 对应的一个key interfaceA +1 ,调用完 -1 ,对第三方接口调用前...

Eclipse自定义keystore_eclipse keystore-程序员宅基地

首先新建一个自己的***.keystore。(如果没有,新建过程中参考以下设置)修改keystore密码的命令(keytool为JDK自带的命令工具,my.keystore为自己的文件名)在储存文件的文件夹,按住shift键,点鼠标右键,在此文件路径打开命令窗口。输入命令:keytool -storepasswd -keystore my.keystore执行后_eclipse keystore

随便推点

python之错误:OSError: [WinError 10048]-程序员宅基地

OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次工具:Pycharm问题:博主在进行一次使用socket模块进行服务端和客户端之间的连接时出现如上错误。错误如下:1:server.py 代码# coding=utf-8"""@author: jiajiknag程序功能:服务器"""import socket# 创建套接字一个实例

[转载] 杜拉拉升职记——37 整个我的人,整颗我的心-程序员宅基地

来源:李可. 杜拉拉升职记(第三版). 西安: 陕西师范大学出版社, 2010, 5. 37 整个我的人,整颗我的心 这年,拉拉正好满30岁。 拉拉走出首都机场到站出口,有人拍了一下她肩膀,她回头一看,是王伟,手上搭着件大衣站在她身后。 拉拉诧异地问:“你怎么在这儿?” 王伟接过她的手拉行李箱说:“我是北京人呀,我出现在这儿不是再正常不过了吗?” 拉拉跟在后面笑道:“哎,我来吧,小心叫你手...

IP地址概述与应用_ip地址的用法_安杼的博客-程序员宅基地

引言IP地址是用于标识网络节点的逻辑地址,管理IP地址不但是网络管理员的一项重要任务,而且往往是其他各项网络工作的基础。一、IP地址1.1、IP地址作用(1)保证主机间正常通信(2)一种网络编码,用来确定网络中一个节点的位置1.2、IP地址的组成IP地址由两部分组成:网络部分(NETWORK)、主机部分(HOST)1.3、子网掩码作用用来确定IP的网络地址二、IP地址的配置2.1、网络测试工具(1)ipconfig //查看计算机IP地址 .._ip地址的用法

深度学习pytorch- tensor, dtype 和 shape_获取torch.tensor shape和dtype-程序员宅基地

tensorsnum.代表float类型, 一般只用写一个数字, 代表整体。shape: 矩阵大小float32 数字类型tensor 可以表示数字, 1, 2, 3,…, n 维矩阵。import torch# Numbert1 = torch.tensor(1.)t1tensor(1.)t1.dtypetorch.float32t1.shapetorch.Size([])# Vectort2 = torch.tensor([1., 2, 3, 4])_获取torch.tensor shape和dtype

dancing links 题集转自夏天的风-程序员宅基地

POJ3740 Easy Finding [精确覆盖基础题]HUST1017 Exact cover [精确覆盖基础]HDOJ3663Power Stations [精确覆盖]ZOJ3209 Treasure Map [精确覆盖]HDOJ2828Lamp [精确覆盖+重复覆盖判独]HDOJ3498whosyourdaddy [重复覆盖]...

python 实现Hadoop的partitioner和二次排序_hadoop mr排序 python脚本-程序员宅基地

python 实现Hadoop的partitioner和二次排序_hadoop mr排序 python脚本