Leetcode Next Permutation

题目地址:https://leetcode.com/problems/next-permutation/

题目分析:首先需要找到最后一个顺序对中的前一个数,为什么需要找到最后一个顺序对中的前一个数?因为这个数后面都是逆序,也就是说需要从这个数后面找到最后一个比这个数大的数,并与这个数进行交换,交换之后后面部分是逆序的,此时需要将后面这部分进行反转,此时就是next permutation了。

题目解答:

public class Solution {
    public void nextPermutation(int[] num) {
        int lastPS = -1;
        int i = 0;
        
        while(i < num.length - 1){
            if(num[i]<num[i+1]){
                lastPS = i;
            }
            i++;
        }
        
        if(lastPS == -1){
            for(int k = 0;k<num.length/2;k++){
                int temp = num[k];
                num[k] = num[num.length-1-k];
                num[num.length-1-k] = temp;
            }
            return;
        }
        int lastExchange = lastPS+1;
        
        while(lastExchange<num.length&&num[lastExchange]>num[lastPS]) lastExchange++;
        
        lastExchange--;
        
        int temp = num[lastPS];
        num[lastPS] = num[lastExchange];
        num[lastExchange] = temp;
        
        for(int j = lastPS + 1;j<=(lastPS+num.length)/2;j++){
            temp = num[j];
            num[j] = num[num.length-j+lastPS];
            num[num.length-j+lastPS] = temp;
        }
        return;
    }
}

 

posted @ 2015-04-15 00:31  buptubuntu  阅读(93)  评论(0编辑  收藏  举报