• 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));
    
        }
    }
    
  • 相关阅读:
    《C程序设计语言现代方法》第5章 选择语句
    《C语言程序设计现代方法》第4章 编程题
    《C语言程序设计现代方法》第4章 表达式
    《算法竞赛入门经典》第1章 程序设计入门
    《C语言程序设计现代方法》第3章 格式化输入/输出
    《C语言程序设计现代方法》第2章 编程题
    《C语言程序设计现代方法》第2章 C语言基本概念
    《C语言程序设计现代方法》第1章 C语言概述
    Linux和Windows下的进程管理总结
    silvetlight ListBox Item项自动填满
  • 原文地址:https://www.cnblogs.com/sunshine-2015/p/7426311.html
Copyright © 2020-2023  润新知