leetcode — next-permutation

import java.util.Arrays;


/**
 * Source : https://oj.leetcode.com/problems/next-permutation/
 *
 * Created by lverpeng on 2017/7/13.
 *
 * * 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 NextPermutation {

    /**
     * 寻找多个数字组成的数字序列中的下一个,比如:1,2,3组成的序列
     * 123,132,213,231,312,312
     *
     * 规律如下:
     * 从右向左找到第一个num[i] > num[i-1]
     * 然后从右向左找到第一个num[k] > num[i-1]
     * 交换两个位置
     * 对num[i-1]后面元素排序
     *
     * 边界条件:i = 1的时候还没找到num[i-1]就把整个数字的各个位翻转顺序
     *
     *
     * @param num
     * @return
     */
    public void nextPermutation (int[] num)  {
        for (int i = num.length - 1; i > 0; i--) {
            if (num[i] > num[i-1]) {
                int k = num.length - 1;
                while (num[i-1] > num[k]) {
                    k --;
                }
                // swap
                int temp = num[i-1];
                num[i-1] = num[k];
                num[k] = temp;
                reverse(num, i, num.length - 1);
                return ;
            }

            // 边界情况,已经是最大了,转化为最小
            if (i == 1) {
                reverse(num, 0, num.length - 1);
                return ;
            }

        }
    }

    private void reverse (int[] arr, int start, int end) {
        if (start < 0 || end > arr.length - 1 || start > end) {
            return;
        }

        while (start < end) {
            int temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;
            end --;
            start ++;
        }
    }

    public static void main(String[] args) {
        NextPermutation nextPermutation = new NextPermutation();
        int[] arr1 = new int[]{1, 2, 3, 4};
        nextPermutation.nextPermutation(arr1);

        System.out.println(Arrays.toString(arr1));

        int[] arr2 = new int[]{1, 3, 2, 4};
        nextPermutation.nextPermutation(arr2);
        System.out.println(Arrays.toString(arr2));


        int[] arr3 = new int[]{4,3,2,1};
        nextPermutation.nextPermutation(arr3);
        System.out.println(Arrays.toString(arr3));

    }
}
posted @ 2017-08-25 08:22  lacker  阅读(112)  评论(0编辑  收藏  举报