zoukankan      html  css  js  c++  java
  • Next Permutation

    问题描述

      找出数组的下一个排列数组,如:
                            1,2,3 -> 1,3,2
                            1,1,5 -> 1,5,1
      分析后发现,这里的全排列可以组成这样的一个循环,比如:
        1,2,3 -> 1,3,2 -> 2,1,3 -> 2,3,1 -> 3,1,2 -> 3,2,1 -> 1,2,3

    唯一要求

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

    解题思路

        从后往前遍历,找到降序的位置,如果整个序列没有降序的位置,例如 3,2,1,则直接返回升序序列。如果有降序情况,记录下标为 j,然后再次从后往前找到第一个大于 nums[j] 的值,交换这两个元素的值 ,将下标 j + 1 及往后的序列升序 即得到下一个排列。

     1 public class Solution {
     2     public void nextPermutation(int[] nums) {
     3         int n = nums.length;
     4         int j = -1;
     5         for (int i = n - 2; i >= 0; i --) {
     6             if (nums[i] < nums[i + 1]) {
     7                 j = i;
     8                 break;
     9             }
    10         }
    11         if (j == -1) {
    12             Arrays.sort(nums);
    13             return;
    14         }
    15         for (int k = n - 1; k > j; k --) {
    16             if (nums[k] > nums[j]) {
    17                 int tmp = nums[k];
    18                 nums[k] = nums[j];
    19                 nums[j] = tmp;
    20                 break;
    21             }
    22         }
    23         // reverse j+1 - end
    24         reverse(nums, j + 1, n - 1);
    25     }
    26 
    27     private void reverse(int[] nums, int l, int r) {
    28         while (l < r) {
    29             int tmp = nums[r];
    30             nums[r] = nums[l];
    31             nums[l] = tmp;
    32             l ++;
    33             r --;
    34         }
    35     }
    36 }
  • 相关阅读:
    母函数
    匈牙利算法
    AC 自动机
    MFC Invalidate闪屏问题
    求解x=a^b(mod m)
    Millar_rabin和Pollard_Rho
    图论入门算法理解
    Numpy 库常用函数大全
    Linux 系统中“|”管道的作用是什么
    win10 万能修复公式
  • 原文地址:https://www.cnblogs.com/dogeLife/p/10998945.html
Copyright © 2011-2022 走看看