题目

31. Next Permutation

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 and use only constant 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

解答

分析这道题:求刚好大于当前排列的数组,并且只能通过交换位置的方式实现。实际上是大整数用数组来实现,比如123,刚好比它大的是132. 这里要分3个步骤解决:

  1. 从右到左,找出第一个当前数小于其右侧的数字,位置为i;
  2. 再次从右到左,找出第一个数字比位置i的数大的数,位置为j;交换位置i和j;
  3. 把i+1 到最后的数组逆序。

具体如下图所示。

package array;public class NextPermutation {public void nextPermutation(int[] nums) {int i = nums.length - 2;// find the first small numberwhile (i >= 0 && nums[i] >= nums[i + 1]) {i--;}// switch with the just last then the nums[i] numberif (i >= 0) { // validate whether is -1int j = nums.length - 1;while (j >= 0 && nums[j] <= nums[i]) {j--;}swap(nums, i, j);}// swap the array from i + 1 to the endreverse(nums, i+1, nums.length - 1);}private void swap(int[] nums, int from, int to) {int temp = nums[from];nums[from] = nums[to];nums[to] = temp;}private void reverse(int[] nums, int from, int to) {while (from < to) {swap(nums, from, to);from++;to--;}}
}

算法:求刚好大于当前数组组合Next Permutation相关推荐

  1. 【iOS高级资深工程师面试篇】⑪、2022年,金九银十我为你准备了《iOS高级资深工程师面试知识总结》 算法部分 字符串反转-链表反转-有序数组组合-Hash算法-查找两个子视图的共同父视图

    iOS高级资深工程师面试篇系列 - 已更新3篇 UI部分1/3 -UITableView-事件传递&视图响应 UI部分2/3 -图像显示原理-UI卡顿&掉帧 UI部分3/3 -UIVi ...

  2. 全排列算法(无重复数字全排列/有重复数字全排列)/ 组合算法/ 求子集算法

    写在前面 全排列 1 无重复数字全排列 1.1 紫书版本 1.2 回溯法 2 有重复数字全排列 复盘易错点(可跳过) 写在前面 很久很久以前就想写的一篇博客,因为懒一直没开工,但是学习全排列算法算是我 ...

  3. 求从n个数组任意选取一个元素的所有组合

    求从n个数组任意选取一个元素的所有组合,对于这个问题,我们在直观上感觉很容易,但是用程序实现时则发现用for循环解决不了问题,因为n是随意的.在这里,我们用递归的思想,对于数据[1, 3, 4]; [ ...

  4. KMP算法求next数组

    1.简介 Knuth-Morris-Pratt 算法,简称 \text{KMP}KMP 算法,由 \text{Donald Knuth}Donald Knuth.\text{James H. Morr ...

  5. java打印数组的连续非空子集_Apriori算法求数组的非空子集java代码

    Apriori算法求集合的非空子集java代码 public class Test { public static void main(String[] args) { String str=&quo ...

  6. js实现多维数组组合算法

    前言 最近在搞一个航线管理系统,如图,需要根据起始点,中转点和终点绘制航线图.这就涉及到点与点之间的组合算法.用专业点的说法,就是多维数组之间的元素组合.就拿上面的航线图来说,我们可以抽象为下面的数组 ...

  7. php算法不大于n的质数,php求不大于n的质数

    php求不大于n的质数: 使用循环遍历.当为质数时加入list中public class Test4 { public static void main(String[] args) { Test4 ...

  8. 算法 64式 18、数组算法整理

    1 算法思想 2 数组系列 类别-编号 题目 来源 1 二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维 ...

  9. 求两个有序数组的中位数或者第k小元素

    问题:两个已经排好序的数组,找出两个数组合并后的中位数(如果两个数组的元素数目是偶数,返回上中位数). 设两个数组分别是vec1和vec2,元素数目分别是n1.n2. 算法1:最简单的办法就是把两个数 ...

  10. LeetCode算法题个人笔记【数组】【简单1-5】【c++】

    资料来源于leetcode官网 记得多看评论! 听从大佬建议从同一类型题目开始做,首先决定做数组! 前面还有三道简单题已经做过了.共47道简单题 ** 第一题:搜索插入位置 ** 给定一个排序数组和一 ...

最新文章

  1. Linux数据库性能优化--文件系统相关优化
  2. Win7安装golang开发环境--备忘录
  3. 中国大学MOOC 人工智能导论第一章测试
  4. 2019 GUDT RC 2 Problem C(题解)
  5. 将Java服务公开为Web服务
  6. Chrome浏览器导入证书(谷歌浏览器导入burpsuite证书)
  7. linux系统监控和进程管理
  8. oracle新建对象 权限管理
  9. IT人 不要一辈子靠技术生存(转)
  10. UnityShader28:噪声纹理
  11. Android RecyclerView批量更新notifyItemRangeChanged
  12. PHP文件操作-读取数据库文件路径复制到另一个目录
  13. Vue学习笔记 出自http://www.cnblogs.com/chenzechuang/p/6687267.html#top
  14. 犀牛建计算机键盘,犀牛建模基础教程 键盘建模
  15. 北京购房攻略(4.17)
  16. 手机应用程序的可用性研究数据的获取、过滤、分析
  17. win10远程连接ubuntu18.4
  18. Elasticsearch 7.x 常用指标聚合、桶聚合搜索RESTful API
  19. 仓库标准作业流程与WMS系统规划
  20. mybatisplus where或and后面的条件用括号括起来

热门文章

  1. python分片赋值_关于 python 分片赋值
  2. 【C++】 ArcFace Demo2.0版
  3. 2019刚开年全球天气已“爆表” 多国极端天气打破历史纪录
  4. 什么是多线程,锁,死锁,怎么避免死锁(转)
  5. Linux运维(三)
  6. pg_stat wait timeout
  7. 使用变量替换批量部署GoldenGate
  8. SCCM 2007 R7使用手记
  9. Java中parseInt()和valueOf(),toString()的区别
  10. 南阳oj-----一种排序(优先队列法)