lintcode刷題——下一個排列

題目如下:

下一個排列 

給定一個若干整數的排列,給出按正數大小進行字典序從小到大排序後的下一個排列。

如果沒有下一個排列,則輸出字典序最小的序列。

樣例

左邊是原始排列,右邊是對應的下一個排列。

1,2,3 → 1,3,2

3,2,1 → 1,2,3

1,1,5 → 1,5,1

挑戰 

不允許使用額外的空間。


做題思路:

1、一開始沒有讀懂題意,其實意思是排列是這樣的,如果是123,下一個排列就是逐漸增大的,一次爲,123 132 213 231 312 321  如果是最後一個321,那麼下一個又回到123,循環着來;

2、從後往前尋找升序序列,當升序序列到末尾的時候,找到升序中第一個大於下一個數字的數,交換之後再將升序許列排序,例如:

原來序列是146521,從後往前找到升序序列是1256,下一個數是4,在升序序列中,5是第一個大於4的數,交換5和4,然後從第三個數直到最後開始排序,最後結果是151246.如果原本序列從頭到尾都是降序的,那麼直接排序處理即可。

具體的C++代碼如下:

class Solution {
public:
    /**
     * @param nums: a vector of integers
     * @return: return nothing (void), do not return anything, modify nums in-place instead
     */
    void nextPermutation(vector<int> &nums) {
        // write your code here
        int len=nums.size();
        int i,j;
        for(i=len-1;i>=0;i--)
        {
            for(j=len-1;j>i;j--)
            {
                if(nums[i]<nums[j])
                {
                    swap(nums[i],nums[j]);
                    sort(nums.begin()+i+1,nums.end());
                    return;
                }
            }
        }
        sort(nums.begin(),nums.end());
    }
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章