1. 程式人生 > >LeetCode31.下一個排列(字典序全排列)

LeetCode31.下一個排列(字典序全排列)

實現獲取下一個排列的函式,演算法需要將給定數字序列重新排列成字典序中下一個更大的排列。

如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。

必須原地修改,只允許使用額外常數空間。

以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

思路分析:

下面貼一張leetcode上官方解答動圖,有助於理解:

Next Permutation

實現原始碼:

package Algorithm.LeetCode;
/*31. 下一個排列
實現獲取下一個排列的函式,演算法需要將給定數字序列重新排列成字典序中下一個更大的排列。
        如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。
        必須原地修改,只允許使用額外常數空間。
        以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
        1,2,3 → 1,3,2
        3,2,1 → 1,2,3
        1,1,5 → 1,5,1*/
import java.util.Arrays;
public class Solution10 {
    public static void nextPermutation(int[] nums) {
        if(nums.length==1){
            System.out.println(nums[0]);
            return;
        }
        if(nums.length==2){
            int temp = nums[0];
            nums[0] = nums[1];
            nums[1] = temp;
            System.out.println("["+nums[0]+","+nums[0]+"]");
            return;
        }
        int i = nums.length-2;
        for(;i >= 0;i--){
            boolean flag = false;
            for(int j = i + 1;  j < nums.length;j ++ ){
                if(nums[j]>nums[i]){
                    flag =true;
                    break;
                }
            }
            if(flag==true)
                break;
        }
        System.out.println(i);
        if(i==-1){
            Arrays.sort(nums);
            return;
        }
        int j = i+1;
        int smallest = nums[j];
        int index = i+1;
        for(;j<nums.length;j++){
            if(nums[j]>nums[i]&&nums[j]<smallest){
                smallest=nums[j];
                index = j;
            }
        }
        int temp = nums[i];
        nums[i] = nums[index];
        nums[index] = temp;
        if(i==0){
            Arrays.sort(nums,1,nums.length);
        }
        else{
            Arrays.sort(nums,i+1,nums.length);
        }
        System.out.print("[");
        for(int k = 0 ; k < nums.length-1;k++){
            System.out.print(nums[k]+",");
        }
        System.out.print(nums[nums.length-1]);
        System.out.println("]");
    }
    public static void main(String[] args) {
        int [] data = {3,2,1};
        nextPermutation(data);
    }
}