首页 > 代码库 > LeetCode 31 Next Permutation(下一个全排列)

LeetCode 31 Next Permutation(下一个全排列)

题目链接: https://leetcode.com/problems/next-permutation/?tab=Description
 
Problem :寻找给定int数组的下一个全排列(要求:be in-place)
 
倒序查找到该数组中第一个满足后面的数字大于前面的数字的下标i (当前下标 i 指向 后面的那个比较大的数)
 
 
参考代码: 
package leetcode_50;/*** *  * @author pengfei_zheng * 下一个全排列 */public class Solution31 {    public static void nextPermutation(int[] nums) {        int len = nums.length;        if(len<=1)            return;        int i = len - 1;        for(;i>=1;i--){//从后先前遍历                if(nums[i]>nums[i-1]){                    //找到第一个后面的数字大于相邻的前面的那个数的下标 (此时下标指向较大的那个数字)                    break;                }        }        if(i!=0){                swap(nums,i-1);//从后向前遍历,交换第一个大于index=i-1的那个数        }        reserver(nums,i);//将从下标i开始的数组进行从小到大的排序    }    private static void swap(int[] nums, int i) {        for(int j=nums.length-1;j>i;j--){//从后向前遍历            if(nums[j]>nums[i]){                int t = nums[j];                nums[j]=nums[i];                nums[i]=t;                break;//交换第一个比前面的index=i-1的那个数            }        }    }    //从下标i开始到nums.length-1结束,实现从小到大排列    private static void reserver(int[] nums, int i) {        int first = i;        int last = nums.length-1;        while(first<last){            int t = nums[first];            nums[first]=nums[last];            nums[last]=t;            first++;            last--;        }    }    public static void main(String[]args){        //int []nums={6,3,4,9,8,7,1};        int []nums={1,2,4,3};        nextPermutation(nums);        for(int n:nums){            System.out.print(n+" ");        }    }}

 

LeetCode 31 Next Permutation(下一个全排列)