zoukankan      html  css  js  c++  java
  • 【LeetCode】031. Next Permutation

    题目:

    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).

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

    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
    

      

    题解:

      from here

    Solution 1 () 

    class Solution {
    public:
        void nextPermutation(vector<int>& nums) {
            int n = nums.size();
            for(int i=n-2; i>=0; --i) {
                if(nums[i]>=nums[i+1]) continue;
                int j = n-1;
                for(; j>i; --j) {
                    if(nums[j]>nums[i]) break;
                }
                swap(nums[i], nums[j]);
                reverse(nums.begin()+i+1, nums.end());
                return;            
            }
            reverse(nums.begin(), nums.end());
        }
    };

      from here

    Solution 2 ()

    class Solution {
    public:
        void nextPermutation(vector<int> &nums) {
            if (nums.empty()) return;  
            // in reverse order, find the first number which is in increasing trend (we call it violated number here)
            int i;
            for (i = nums.size()-2; i >= 0; --i) {
                if (nums[i] < nums[i+1]) break;
            }
            // reverse all the numbers after violated number
            reverse(nums.begin()+i+1, nums.end());
            // if violated number not found, because we have reversed the whole array, then we are done!
            if (i == -1) return;
            // else binary search find the first number larger than the violated number
            auto itr = upper_bound(nums.begin()+i+1, nums.end(), nums[i]);
            // swap them, done!
            swap(nums[i], *itr);
        }
    };

      Solution 3-5 are from here (Solution 2 和 Solution 3 其实是一个解法 )

    Solution 3 ()

    class Solution {
    public:
        void nextPermutation(vector<int>& nums) {
            int i = nums.size() - 1, k = i;
            while (i > 0 && nums[i-1] >= nums[i])
                i--;
            for (int j=i; j<k; j++, k--)
                swap(nums[j], nums[k]);
            if (i > 0) {
                k = i--;
                while (nums[k] <= nums[i])
                    k++;
                swap(nums[i], nums[k]);
            }
        }
    };

      使用STL库函数

    Solution 4 ()

    class Solution {
    public:
        void nextPermutation(vector<int>& nums) {
            auto i = is_sorted_until(nums.rbegin(), nums.rend());
            if (i != nums.rend())
                swap(*i, *upper_bound(nums.rbegin(), i, *i));
            reverse(nums.rbegin(), i);
        }
    }; 

       使用STL库函数

    Solution 5 ()

    class Solution {
    public:
        void nextPermutation(vector<int>& nums) {
            next_permutation(begin(nums), end(nums));
        }
    };
  • 相关阅读:
    background-position-x和background-position-y的兼容性问题
    用SVGDeveloper制作svg地图
    实现绝对定位元素水平垂直居中的两种方法
    用-webkit-box-reflect制作倒影
    解决ul的li横向排列换行的问题
    用echarts.js制作中国地图,点击对应的省市链接到指定页面
    css3制作扇形菜单
    IE7中a标签包含img,点击img,链接失效的bug
    ie7中position:fixed定位后导致margin:0 auto;无效
    背景图片铺满全屏的方法
  • 原文地址:https://www.cnblogs.com/Atanisi/p/6759466.html
Copyright © 2011-2022 走看看