Fork me on GitHub

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

 
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+" ");
        }
    }
}

 

posted @ 2017-03-10 17:24  伊甸一点  阅读(208)  评论(0编辑  收藏  举报