1. 题目

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须原地修改,只允许使用额外常数空间。

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-permutation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 类似的题目:
    程序员面试金典 - 面试题 05.04. 下一个数(线性扫描)
    LeetCode 1053. 交换一次的先前排列

2.1 next_permutation

bool prev_permutation (BidirectionalIterator first, BidirectionalIterator last);
没有下一个更小或者更大的,返回的是false
class Solution {public:void nextPermutation(vector<int>& nums) {next_permutation(nums.begin(),nums.end());}
};

4 ms 6.8 MB

2.2 从后往前找第一个下降点

  • 找到下降点 i
  • 向后找比 i 点大的最小的数,进行交换
  • 最后把 i 后面的数字升序排列(反转即可)
class Solution {public:void nextPermutation(vector<int>& nums) {if(nums.size() <= 1)return;int i = nums.size()-2, j, n = nums.size();while(i >= 0 && nums[i] >= nums[i+1])i--;//找下降点if(i>=0){j = i+1;while(j < n && nums[i] < nums[j])j++;//找比 i 点大的,最小点swap(nums[i], nums[j-1]);   }reverse(nums,i+1,n-1);//反转 i+1, end}inline void reverse(vector<int>& a, int l, int r){while(l < r)swap(a[l++],a[r--]);}
};

0 ms 6.9 MB

LeetCode 31. 下一个排列(线性扫描)相关推荐

  1. Java实现 LeetCode 31下一个排列

    31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许 ...

  2. leetcode —— 31. 下一个排列

    实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...

  3. LeetCode 31. 下一个排列 Next Permutation

    实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...

  4. Leetcode 31. 下一个排列 (每日一题 20210831)

    实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数).如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列).必须 原地 ...

  5. LeetCode.31 下一个排列

    题目描述 实现获取下一个排列的算法,算法需要将给定的数组,重新排列成下一个更大的排列(即组合出下一个更大的数字). 如果不存在下一个更大的排列,则将数字重新排列成最小的排列. 题目思路 我们可以使用如 ...

  6. leetcode 31.下一个排列

    题目 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空 ...

  7. LeetCode 31 下一个排列

    https://leetcode-cn.com/problems/next-permutation/ 解决方案 class Solution {public void nextPermutation( ...

  8. 【LeetCode】【HOT】31. 下一个排列

    [LeetCode][HOT]31. 下一个排列 文章目录 [LeetCode][HOT]31. 下一个排列 package hot;import java.util.Arrays;public cl ...

  9. LeetCode每日一题--31. 下一个排列(数学)

    题目:跳转至 31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原 ...

最新文章

  1. 不再使用快捷方式打开电脑软件!如何Windows+r 来打开一个你想要打开的软件软件?
  2. 怎么用IDEA快速查看类图关系?
  3. 本周进步要点20161009
  4. Divide it!
  5. Kafka分区分配策略(3)——自定义分区分配策略
  6. java ee编译器_Java EE 8 MVC:控制器的详细介绍
  7. 干货:不同场景容器内获取客户端源IP的方法
  8. 关于树的父子节点的图形化展示
  9. 结构数组-创建结构数组---获取修改结构数组数据-------操作字段
  10. 《怪物猎人:世界》鼠标侧键点击无效的解决方法(罗技g402)
  11. python寻找完全平方数_279 完全平方数(bfs)
  12. 聚类算法评价指标python实现_聚类算法及其评估指标
  13. 即时聊天系统(IM)发送文件语音视频的两种方式比较
  14. 基于Matlab的Poisson分布,基于matlab的泊松分布的仿真.doc
  15. matlab示波器多个接口,simulink在一个图形中画出多个示波器曲线的方法
  16. python批量合并excel文件,后缀名为xls
  17. C#导入导出数据到Excel的通用类源码
  18. kfc小程序_利用实验室成长的“未来之肉”将肯德基转换为3D打印鸡肉
  19. Apache Druid远程代码执行漏洞(CVE-2021-25646)
  20. Redis教程之基础-五种数据基本操作

热门文章

  1. Storm程序的并发机制原理总结
  2. 汇编指令的学习4——ldm/stm指令、栈的处理
  3. VMWare虚拟机NAT模式静态IP联网配置
  4. 【 iview 实践指南】之如何优雅地在Table中嵌套Input(代码篇)
  5. Sublime Text3(mac)一些插件和快捷键
  6. Flow monitoring in Software-Defined Networks
  7. Python中 sys.argv[]的用法
  8. mysqldump 定时备份数据(全量)
  9. HDU5971【瞎搞】
  10. FC网络学习笔记02 -网络配置方法