Leetcode Next Permutation

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

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

题目解答:blog

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;
    }
}
相关文章
相关标签/搜索