31. Next Permutation

原创 2016年08月31日 10:41:31

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, do not allocate 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

public class Solution {
    public void nextPermutation(int[] A) {
        if(A == null || A.length <= 1) return;
        int i = A.length - 2;
        while(i >= 0 && A[i] >= A[i + 1]) i--; // Find 1st id i that breaks descending order
        if(i >= 0) {                           // If not entirely descending
            int j = A.length - 1;              // Start from the end
            while(A[j] <= A[i]) j--;           // Find rightmost first larger id j
            swap(A, i, j);                     // Switch i and j
        }
        reverse(A, i + 1, A.length - 1);       // Reverse the descending sequence
    }

    public void swap(int[] A, int i, int j) { // 俩交换方法差不多
        // int tmp = A[i];
        // A[i] = A[j];
        // A[j] = tmp;
        A[i] = A[i] + A[j];
        A[j] = A[i] - A[j];
        A[i] = A[i] - A[j];
    }

    public void reverse(int[] A, int i, int j) {
        while(i < j) swap(A, i++, j--);
    }
}
// 题目思路
// 先右边找第一个违反递减规则的数,这个数后面就是递减的了,该数为目标数a
// 再从右边找第一个比目标数a大的数,该数为目标数b
// a b互换,中间的递减序列分别互换,得结果
// 思路相当棒啊~~~~
版权声明:本文为博主原创文章,转载须注明出处,谢谢~

相关文章推荐

LeetCode 31 Next Permutation (C,C++,Java,Python)

Problem: Implement next permutation, which rearranges numbers into the lexicographically next g...

Leetcode——31. Next Permutation

题目Implement next permutation, which rearranges numbers into the lexicographically next greater permu...

【leetcode】【31】Next Permutation

一、问题描述 Implement next permutation, which rearranges numbers into the lexicographically next gre...

leetcode31~Next Permutation

Implement next permutation, which rearranges numbers into the lexicographically next greater permuta...

【LeetCode】31. Next Permutation解法

31. Next Permutation Implement next permutation, which rearranges numbers into the lexicographic...

31. Next Permutation | Java最短代码实现

原题链接:31. Next Permutation 【思路】 首先,我们来了解一下——字典序法: C++的STL库里面有nextPermutation()方法,其实现就是字典序法。 下...

leetcode No31. Next Permutation

Question: Implement next permutation, which rearranges numbers into the lexicographically next grea...

LeetCode 31: Next Permutation

Next PermutationImplement next permutation, which rearranges numbers into the lexicographically next...

Leetcode 31 Next Permutation (C++实现)

Leetcode 31 Next Permutation解题。c++实现。

LeetCode (31)Next Permutation

(31)Next Permutation题目:找到比目标数大的,只使用目标数内数字组成的最小的数。如果这种安排是不可能的,它必须重新安排它作为最低可能的顺序(即按升序排序)。更换必须到位,不要分配额外...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:31. Next Permutation
举报原因:
原因补充:

(最多只允许输入30个字)