LintCode_190 Next Permutation II

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

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

Example

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.

1,2,3 → 1,3,2

3,2,1 → 1,2,3

1,1,5 → 1,5,1

Challenge 

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

若果都是遞減的, 那麼已經到最大。所以只要找到那個不是遞減的點, 然後找到比他大的最小的店, 交換, 然後把剩餘布馮升序排列, 組合便可。


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
        // write your code here
        bool finished = false;
        if (nums.size() <= 1)
             finished = true;
        priority_queue<int, vector<int>> pq;
        vector<int> back_vec;
        pq.push(INT_MIN);
        unordered_map<int, int> map;
        for (int i = nums.size() - 1; i >= 0 && !finished; i--) {
             if (nums[i] < pq.top()) {
                 back_vec.push_back(nums[i]);
                 sort(back_vec.begin(), back_vec.end());
                 auto itr = upper_bound(back_vec.begin(), back_vec.end(), nums[i]);
                 nums[i] = *itr;
                 back_vec.erase(itr);
                 nums.erase(nums.begin() + i + 1, nums.end());
                 nums.insert(nums.end(), back_vec.begin(), back_vec.end());
                 finished = true;
             } else {
                 pq.push(nums[i]);
                 back_vec.push_back(nums[i]);
             }
        }
        if (!finished)
           sort(nums.begin(), nums.end());
    }
};





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