下一个排列

Posted 上善若水的爹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了下一个排列相关的知识,希望对你有一定的参考价值。

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

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

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

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

解答:

  

技术图片
/**
   * [1,2,3] 的字典序是[1,2,3];[1,3,2];[2,1,3];[2,3,1];[3,1,2];[3,2,1];这样的
   * @param nums
   */
  public static void nextPermutation(int[] nums) {
    /*当数组为null或元素小于1时直接返回*/
    if (nums == null || nums.length < 2) {
      return;
    }
    int length = nums.length;
    int c = length - 2;
    /*找出前一个元素比后一个元素小的下标*/
    while (c >= 0 && nums[c] >= nums[c + 1]) {
      c--;
    }
    /*当存在前一个元素比后一个元素小的下标*/
    if (c >= 0) {
      int in = length - 1;
      /*从数组末尾找到第一个比c大的元素下标*/
      while (in >= 0 && nums[in] <= nums[c]) {
        in--;
      }
      /*暂存c下标对应的值*/
      int tmp = nums[c];
      /*c下标赋值in对应的值*/
      nums[c] = nums[in];
      /*in下标赋值暂存c对应的值*/
      nums[in] = tmp;
    }
    /*从c+1开始,数组末尾截止,把元素翻转*/
    int start = c + 1;
    int end = length - 1;
    while (start < end) {
      int tmp = nums[start];
      nums[start] = nums[end];
      nums[end] = tmp;
      start++;
      end--;
    }
  }
View Code

 

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-permutation

以上是关于下一个排列的主要内容,如果未能解决你的问题,请参考以下文章

在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途

有人知道下面的代码片段是啥意思吗?

你可能不知道的JavaScript代码片段和技巧(下)

java刷题--31下一个排列

下一个排列问题next_permutation

如何在片段中使用 GetJsonFromUrlTask​​.java