31. Next Permutation

public class Solution {
    public void nextPermutation(int[] nums) {
        /*
            假設數組大小爲 n
            1.從後往前,找到第一個 A[i-1] < A[i]的。也就是第一個排列中的  6那個位置,能夠看到A[i]到A[n-1]這些都是單調遞減序列。
            2.從 A[n-1]到A[i]中找到一個比A[i-1]大的值(也就是說在A[n-1]到A[i]的值中找到比A[i-1]大的集合中的最小的一個值)
            3.交換 這兩個值,而且把A[n-1]到A[i+1]排序,從小到大。
        */
        int size=nums.length;
        
        if(nums==null||size==0||size==1)
            return ;
        int i=size-2;
        
        while(i>=0&&nums[i]>=nums[i+1])
            i--;
        if(i!=-1)
        {
            int j=i+1;
            while(j<size&&nums[j]>nums[i])
                j++;
            j--;
            swap(nums,i,j);
        }
        reverse(nums,i+1,size-1);
        
    }
    public void reverse(int []nums,int i,int j)
    {
        while(i<j)
        {
            swap(nums,i,j);
            i++;
            j--;
        }
    }
    
    public void swap(int []nums,int i,int j)
    {
        int temp=nums[i];
        nums[i]=nums[j];
        nums[j]=temp;
    }
}
相關文章
相關標籤/搜索