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());
    }
};

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