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

原题链接: 31. Next Permutation

【思路】

首先,我们来了解一下——字典序法:

C++的STL库里面有nextPermutation()方法,其实现就是字典序法。

下图简单明了地介绍了字典序法

31. Next Permutation | Java最短代码实现_第1张图片

例如,1234的全排列如下:

31. Next Permutation | Java最短代码实现_第2张图片

简单归纳,从右边开始,找到第一个正序数 nums[i] ,然后从右边找第一个大于 num[i] 的数 nums[j](j > i),找到之后交换 nums[i] 和 nums[j] ,最后将 nums[i + 1] 至 nums[nums.length - 1]之间的数进行反转:
    public void nextPermutation(int[] nums) {
        for (int i = nums.length - 2; i >= 0; i--)
            if (nums[i] < nums[i + 1])
                for (int j = nums.length - 1; j > i; j--)
                    if (nums[i] < nums[j]) {
                        swap(nums, i, j);
                        reverse(nums, i + 1, nums.length - 1);
                        return;
                    }
        reverse(nums, 0, nums.length - 1);
    }
    private void swap(int[] nums, int left, int right) {
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
    }
    private void reverse(int[] nums, int left, int right) {
        while (left < right)
            swap(nums, left++, right--);
    }
265 / 265  test cases passed. Runtime: 2 ms  Your runtime beats 9.15% of javasubmissions.
欢迎优化!

你可能感兴趣的:(java,LeetCode)