31. Next Permutation

来源:互联网 发布:java invokeAll 测试 编辑:程序博客网 时间:2024/05/16 18:56

Next Permutation

题意:

求下一个排列
主要原理可以看下面这个链接:
http://blog.csdn.net/qq575787460/article/details/41215475

代码实现

基本原理:

  在当前序列中,从尾端往前寻找两个相邻元素,前一个记为first,后一个记为second,并且满足first 小于 second。然后再从尾端寻找另一个元素number,如果满足first 小于number,即将第first个元素与number元素对调,并将second元素之后(包括second)的所有元素颠倒排序,即求出下一个序列
  
  example: 6,3,4,9,8,7,1 此时 first = 4,second = 9 从尾巴到前找到第一个大于first的数字,就是7 交换4和7,即上面的swap函数,此时序列变成6,3,7,9,8,4,1 再将second=9以及以后的序列重新排序,让其从小到大排序,使得整体最小,即reverse一下(因为此时肯定是递减序列) 得到最终的结果:6,3,7,1,4,8,9

public class Solution {    public void nextPermutation(int[] nums) {        if(nums.length <= 1)  ///排除不可能            return;        int i = nums.length - 1;        for(;i > 0; i--){  ///找出一个降序的地方            if(nums[i] > nums[i-1]){                break;            }        }        if(i != 0){  //然后进行交换,如果等于0,表示这是一个降序的数组,直接进行反转            swap(nums , i-1);        }        reverse(nums , i);  //进行反转    }    public void swap(int[] a , int i){        for(int j = a.length - 1; j > i; j--){            if(a[j] > a[i]){                int t = a[j];                a[j] = a[i];                a[i] = t;                break;            }        }    }    public void reverse(int[] a , int i){        int right = a.length - 1;        int left = i;        while(right > left){            int temp = a[right];            a[right] = a[left];            a[left] = temp;            left++;            right--;        }    }}
0 0