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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/FJJ543/article/details/82151010

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须原地修改,只允许使用额外常数空间。

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
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);
    }
}

猜你喜欢

转载自blog.csdn.net/FJJ543/article/details/82151010