[LeetCode]31. Next Permutation下一个排列

Posted jchen104

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode]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,31,3,2
3,2,11,2,3
1,1,51,5,1

 
题目要求把一个序列改变成一个紧接着的,比它大的序列,对于这样的题目,我们可以来找下规律,假设最小序列1234
1,2,3,4
1,2,4,3
1,3,2,4
1,3,4,2
1,4,2,3
1,4,3,2
2,1,3,4
2,1,4,3
 
从上往下看,在以1开头的序列中,我么每次调换的位置都出存在逆序数的情况,从后往前,我们是把逆序开始位置上的数和比它稍大的数进行了替换,得到的稍大的序列
public class Solution {
    public void nextPermutation(int[] nums) {
        int i = nums.length - 2;
        while (i >= 0 && nums[i + 1] <= nums[i]) {
            i--;
        }
        if (i >= 0) {
            int j = nums.length - 1;
            while (j >= 0 && nums[j] <= nums[i]) {
                j--;
            }
            swap(nums, i, j);
        }
        reverse(nums, i + 1);
    }

    private void reverse(int[] nums, int start) {
        int i = start, j = nums.length - 1;
        while (i < j) {
            swap(nums, i, j);
            i++;
            j--;
        }
    }

    private void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

 

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

LeetCode OJ 31. Next Permutation

[array] leetcode - 31. Next Permutation - Medium

[LeetCode] 31. Next Permutation ☆☆☆

Leetcode 31. Next Permutation

LeetCode-31-Next Permutation

[Leetcode]31. Next Permutation