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));
        }
    };
  • 相关阅读:
    struts2的类型转换
    简单的图形验证码
    无法添加某个relationship给SAP CRM Product category的一个可能原因
    如何找到ABAP里被动态调用的update function module
    ABAP数据库表的元数据
    SAP CRM Product hierarchy,Category和Application的三个问题
    使用javap分析Java字节码的一个例子
    在SAP ABAP里使用注解@Inject模拟Java Spring
    SAP系统里的胖接口Fat interface
    如何使用ABAP代码创建SAP Product Category
  • 原文地址:https://www.cnblogs.com/Atanisi/p/6759466.html
Copyright © 2011-2022 走看看