描述:

  Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.

  If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).

  The replacement must be in-place, do not allocate extra memory.

  Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
    1,2,3 → 1,3,2
    3,2,1 → 1,2,3
    1,1,5 → 1,5,1

字典序:

  对于数字1、2、3......n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列 12354和12345,排列12345在前,排列12354在后。按照这样的规定,5个数字的所有的排列中最前面的是12345,最后面的是 54321。

  那么1234的全排列从小到大的顺序也就是字典序的顺序,依次如下:

    1234,1243,1324,1342,1423,1432,2134,2143,2314,2341,2413,2431,3124,3142,3214,3241,3412,3421,4123,4132,4213,4231,4312,4321

  产生字典序下一个的非递归算法:

    设P是[1,n]的一个全排列,P=P1P2...Pn=P1P2...Pj-1PjPj+1...Pk-1PkPk+1...Pn

    寻找j=max{i|Pi<Pi+1},k=max{i|Pi>Pj},swap Pj和Pk,reverse Pj+1...Pn,得到的P‘=P1P2...Pj-1PkPn...Pk+1PjPk-1...Pj+1,即为P的字典序的下一个排列,当然这里指的是等长度的。

代码:

class Solution {
public:void nextPermutation(vector<int>& nums) {int j=-1,k=0,temp,left,right;//j=max{i|pi<pi+1}for( int i=nums.size()-2;i>=0;i-- ){if( nums[i]<nums[i+1] ){j=i;break;}}if( j==-1 ){//3 2 1
            sort(nums.begin(),nums.end());}else{//k=max{i|pi>pj}for( int i=nums.size()-1;i>=0;i-- ){if( nums[i]>nums[j] ){k=i;break;}}//swap pj pktemp=nums[j];nums[j]=nums[k];nums[k]=temp;//reverse pj+1 pnleft=j+1;right=nums.size()-1;while( left<right ){temp=nums[left];nums[left]=nums[right];nums[right]=temp;left++;right--;}  }}
};

转载于:https://www.cnblogs.com/lucio_yz/p/5219844.html

leetcode 31. Next Permutation(字典序的下一个)相关推荐

  1. 【数字全排列】LeetCode 31. Next Permutation

    LeetCode 31. Next Permutation 参考博客:http://www.cnblogs.com/grandyang/p/4428207.html Solution0:一个偷鸡摸狗的 ...

  2. 31. Next Permutation (java 字典序生成下一个排列)

    题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...

  3. LeetCode 31 Next Permutation(下一个全排列)

    题目链接: https://leetcode.com/problems/next-permutation/?tab=Description Problem :寻找给定int数组的下一个全排列(要求:b ...

  4. LeetCode 31. Next Permutation(下一组排列)

    题目描述: Implement next permutation, which rearranges numbers into the lexicographically next greater p ...

  5. LeetCode 117. 填充每个节点的下一个右侧节点指针 II(递归循环)

    文章目录 1. 题目 2. 解题 2.1 递归 2.2 queue循环 2.3 利用next循环 1. 题目 填充它的每个 next 指针,让这个指针指向其下一个右侧节点.如果找不到下一个右侧节点,则 ...

  6. LeetCode 31. Next Permutation

    题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...

  7. LeetCode 116. 填充每个节点的下一个右侧节点指针

    https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/ 难度:中等   给定一个完美二叉树,其所有叶 ...

  8. 49. Leetcode 117. 填充每个节点的下一个右侧节点指针 II (二叉树-二叉树遍历)

    给定一个二叉树struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点.如果找不 ...

  9. [leetcode] 117 填充每个节点的下一个右侧节点指针

    给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点.二叉树定义如下: struct Node {   int val;   Node *left;   Node *right; ...

  10. LeetCode 116. 填充每个节点的下一个右侧节点指针(递归循环)

    文章目录 1. 题目 2. 解题 2.1 递归 2.2 循环 2.3 O(1)空间复杂度 1. 题目 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点.二叉树定义如下: stru ...

最新文章

  1. LSM Tree 学习笔记——MemTable通常用 SkipList 来实现
  2. IEnumerable和IQueryable的区别以及背后的ExpressionTree表达式树
  3. 数据帧,数据包,报文段,报文,分组,数据包的概念和区别
  4. c语言程序设计学生程序查询,《c语言程序设计报告-学生信息管理系统》.doc
  5. Wise Package Studio介绍
  6. JMeter数据库请求配置及示例
  7. 工具分享:xampp-windows-x64-7.3.2-1-VC15-installer.exe 请自行下载(附下载链接)
  8. 第5章 NoSQL数据库
  9. java基础 day-17 设计模式(单例,工厂,代理),静态动态代理,数据库连接池(动态代理)
  10. springboot 自定义starter
  11. 使用阿里云ESC服务器的时候域名解析成功为何打不开网站?
  12. 云原生时代,Kubernetes 让应用落地的 N 种招式(附 PPT)
  13. MS-DOC 文件格式概述
  14. 简单的指针二叉查找树和数组二叉查找树
  15. React从零开始搭建项目
  16. 聊聊互联网平台的四个效应
  17. 这场蝴蝶效应,从“丝滑”的双11开始
  18. OSChina 周六乱弹 —— 这么漂亮的屎一定要拉到自己家里
  19. CAD/CASS批量坐标标注插件(可自动避让、可输出图面坐标标注)
  20. 适用于应急指挥场景下的视频编码器

热门文章

  1. html解决ajax调用跨域,JQuery Ajax执行跨域请求数据的解决方案
  2. php生成静态页面的方法,php生成静态页面的办法
  3. 国足输韩国,柯洁很生气,后果很严重……
  4. LNMP平台部署及应用
  5. 技术干货 | SDN controller高可用之路
  6. 动态提交使用jQuery 完成ajax 文件下载----后端php
  7. OJ 上常见错误提示
  8. 生活随笔:师弟,加油
  9. jdk Double类具体实现
  10. zookeeper分布式原理实战解析