Next Permutation——簡單、經典

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.spa

If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).code

The replacement must be in-place, do not allocate extra memory.blog

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,31,3,2
3,2,11,2,3
1,1,51,5,1it

感受又是一道智商題啊,方法比較難以想到,想到後就容易了,沒有本身寫代碼,直接看的網上的答案·················································io

題意尋找比當前排列順序大的下一個排列。class

1)由於降序序列是無法變的更大的,因此從後往前找到第一個升序對的位置。方法

2)而後就存在調整大小排列順序的可能,從後往前找到比當前位置大的元素,交換之。call

3)當前位置後面的元素仍是降序排列,將他們反轉獲得最小順序排列。其實就是原來當前位置元素後面是最大的排列,而交換後的新元素以後是最小的排列,他們就是相鄰的順序。next

當不存在升序,則當前排列是最大排列,只要旋轉整個序列變成最小排列。 sort

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int i,j,len=num.size();
        for(i=len-2;i>=0;--i)
        {
            if(num[i+1]>num[i])
            {
                for(j=len-1;j>i-1;--j)if(num[j]>num[i])break;
                swap(num[i],num[j]);
                reverse(num.begin()+i+1,num.end());
                return;
            }
        }
        reverse(num.begin(),num.end());
        return;
        
    }
};
相關文章
相關標籤/搜索