下一个排列

两遍扫描:

  • 步骤一:首先从后向前查找第一个顺序对(i,i+1)满足a[i]<a[i+1].这样「较小数」即为a[i].此时[i+1,n)必然是下降序列

  • 步骤二:如果找到了顺序对,那么在区间[i+1,n)中从后向前查找第一个元素j满足a[i]<a[j].这样「较大数」即为a[j]

  • 步骤三:交换a[i]与a[j],此时可以证明区间[i+1,n)必为降序.我们可以直接使用双指针反转区间[i+1,n)使其变为升序,而无需对该区间进行排序

  • 注意:如果在步骤1找不到顺序对,说明当前序列已经是一个降序序列,即最大的序列,我们直接跳过步骤2执行步骤3,即可得到最小的升序序列

    public void nextPermutation(int[] nums) {
    int i = nums.length - 2;
    while (i >= 0 && nums[i + 1] <= nums[i]) {
    i–;
    }//i就是那个较小数

        if (i >= 0) {int j = nums.length - 1;while (j >= 0 && nums[i] >= nums[j]) {j--;}//j就是右边那个最小的比i大的数swap(nums, i, j);}//将右侧的升序改为降序reverse(nums, i + 1, nums.length - 1);
    }public void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;
    }public void reverse(int[] nums, int left, int right) {while (left < right) {swap(nums, left, right);left++;right--;}
    }
    

举一反三:实现 上一个排列
和上面的思想是一样的,只是判断的条件有一些变化(判断条件全部一改 就是上一个排列的代码)

public static void frontPermutation(int[] nums) {int i = nums.length - 2;while (i >= 0 && nums[i] <= nums[i + 1]) {i--;}//i就是那个最小的较大数if (i >= 0) {int j = nums.length - 1;while (j >= 0 && nums[j] >= nums[i]) {j--;}//找到右边比i小的数swap(nums, i, j);}//右侧的降序翻转为升序reverse(nums, i + 1, nums.length - 1);}public static void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}public static void reverse(int[] nums, int left, int right) {while (left < right) {swap(nums, left, right);left++;right--;}}

CodeTop050 下一个排列相关推荐

  1. 《LeetCode力扣练习》第31题 下一个排列 Java

    <LeetCode力扣练习>第31题 下一个排列 Java 一.资源 题目: 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列. 例如,arr = [1,2,3] ,以下这些都可 ...

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

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

  3. LeetCode 30串联所有单词的子串31下一个排列

    标题 串联所有单词得字串 下一个排列 维护真的不易,如有帮助还请点赞关注,关注公众号bigsai回复进群即可加入打卡. 串联所有单词得字串 题目描述: 给定一个字符串 s 和一些长度相同的单词 wor ...

  4. 下一个排列—leetcode31

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

  5. Leecode31. 下一个排列——Leecode大厂热题100道系列

    我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...

  6. 下一个排列Python解法

    整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列. 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3].[1,3,2].[3,1,2].[2,3,1] . ...

  7. 数组的合并和升序排列_leetcode No.31 下一个排列

    题目链接: 下一个排列 - 力扣(LeetCode)​leetcode-cn.com 题目描述: 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个 ...

  8. leetcode31. 下一个排列

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

  9. LeetCode 31. 下一个排列(线性扫描)

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

最新文章

  1. 大赛季(2020)新一代信息技术行业赛赛事公告
  2. Nuget服务的搭建-打包-上传-删除
  3. linux 命令博客,Linux 命令
  4. Windows 技术篇 - 如何查看cpu支持的指令集、型号、属性等详细信息,使用cpu-z工具查看处理器、内存、显卡、主板、缓存、SPD信息方法
  5. .Net NPOI 根据excel模板导出excel、直接生成excel
  6. 项目经理主要工作职责
  7. python将页面保存为html_python – :将html保存为文本
  8. 在置信区间下置信值的计算_使用自举计算置信区间
  9. P1742 最小圆覆盖
  10. 如何快速搭建yum源和成功检测第三方软件
  11. 下个目标是攻克FIFA游戏?DeepMind让AI自学传球配合
  12. 计算机网络性能(2)
  13. Recoverit for Mac(数据恢复软件)
  14. centos 计算器_在Linux命令行中使用计算器的5个命令
  15. 英文字母对应的Unicode编码
  16. 【 机器学习】入门,理论框架以及学习资料
  17. 邮件作为证据如何提交_【欣法官在线】收到起诉状副本,我该如何向法院提交证据?...
  18. rocketmq获取消息id_贞炸了!上线之后,消息收不到了!
  19. HTML/CSS/Javascript在线代码运行网站汇总
  20. 深度学习笔记~感受野(receptive field)的计算

热门文章

  1. 牛客网SQL实战二刷 | Day2
  2. 台积电7nm+ EUV工艺已量产 华为新一代旗舰处理器麒麟985将率先使用
  3. 上海人民正式对垃圾分类了,美国科技清垃圾产业投资创纪录
  4. 张岚老师--上海沪师经纪--刘建
  5. 从分析家中得到股票数据!C#源码 (代码很长,建议火狐)
  6. 华为java实习生面试_华为java实习生一面总结
  7. 金融行业要翻软件定义存储SDS的牌子了吗?
  8. sun公司的java入门
  9. 计算机培训会新闻稿,电子科技协会电子知识讲座新闻稿
  10. linux oracle lrm00109,Oracle:ORA-01078与LRM-00109报错