31. Next Permutation

Difficulty: medium
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

这道题的思路一旦理解了还是非常简单清楚的。举几个例子:

1 3 5 2 4 3
1 3 5 3 2 4

比如上面的例子中,从右往左数前两位3 4 是递增的,也就是最大的排列;但到了第三位2 出现了第一次左边的数字比右边的数字大的情况,而2所在的index就是我们需要找到的first. 然后我们在[first + 1, n - 1]中继续找比2大的最小的数,这里是3,也就是nums[k], 然后我们交换nums[first]和nums[k]. 上面例子就会变成1 3 5 3 2 4. 因为我们是要取下一个排列,也就是比之前排列大的最小的排列,所以我们要排序[nums[k + 1], nums[n- 1]], 这里恰好2 4 已经排好序了。

1 4 5 3 3 6 5
1 4 5 3 5 3 6

4 3 2 1
1 2 3 4

像 4 3 2 1这种已经是最高排列的,就返回正序排列。

注意一下,一开始交换数组里的两个元素的swap方法写错了,写成了:

private void swap(int a, int b){
  int temp = a;
  a = b;
  b = temp;
}

但是这里传入参数是基本类型,a,b传的是值,修改ab对外面的nums[i],nums[j]无影响,所以要修改数组元素必须在方法参数里写上

swap(int[] nums, int a, int b)

class Solution {
    public void nextPermutation(int[] nums) {
        if (nums == null || nums.length == 0 || nums.length == 1){
            return;
        }    
        int n = nums.length;
        int first = -1;
        for (int j = n - 1; j > 0; j--){
            if (nums[j - 1] < nums[j]){
                first = j - 1;
                break;
            }
        }
        if (first == -1){
            Arrays.sort(nums);  
            return;
        }
        int minNext = Integer.MAX_VALUE;
        int minIndex = -1;
        for (int k = first + 1; k < n; k++){
            if (nums[k] > nums[first]){
                if (nums[k] < minNext){
                    minNext = nums[k];
                    minIndex = k;
                }
            }
        }
        swap(nums, first, minIndex);
        Arrays.sort(nums, first + 1, n); 
    }
    
    private void swap(int[] nums, int a, int b){
        int temp = nums[a];
        nums[a] = nums[b];
        nums[b] = temp;
    }
}

你可能感兴趣的:(31. Next Permutation)