zoukankan      html  css  js  c++  java
  • LeetCode OJ--Permutations II

    给的一个数列中,可能存在重复的数,比如 1 1  2 ,求其全排列。

    记录上一个得出来的排列,看这个排列和上一个是否相同。

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
     
    class Solution{
    public:
        vector<vector<int> > permuteUnique(vector<int> &num) {
           vector<vector<int> > ans;
           if(num.size()==0)
               return ans;
    
           vector<int> _num = num;
           sort(_num.begin(),_num.end());
    
           vector<int> _beforeOne = _num;
           ans.push_back(_num);
           while(nextPermutation(_num))
           {
               if(_num != _beforeOne)
               {
                   ans.push_back(_num);
                   _beforeOne = _num;
               }
           }
           return ans;
        }
    private:
        bool nextPermutation(vector<int> &num)
        {
            return next_permutation(num.begin(),num.end());
        }
    
        template<typename BidiIt>
        bool next_permutation(BidiIt first,BidiIt last)
        {
            const auto rfirst = reverse_iterator<BidiIt>(last);
            const auto rlast = reverse_iterator<BidiIt>(first);
    
            auto pivot = next(rfirst);
            while(pivot != rlast && *pivot >= *prev(pivot))
            {
                ++pivot;
            }
            
            //this is the last permute, or the next is the same as the begin one
            if(pivot == rlast)
            {
                reverse(rfirst,rlast);
                return false;
            }
            //find the first num great than pivot
            auto change = rfirst;
            while(*change<=*pivot)
                ++change;
    
            swap(*change,*pivot);
            reverse(rfirst,pivot);
            return true;
        }
    };
    
    int main()
    {
        vector<int> num;
        num.push_back(1);
        num.push_back(1);
        num.push_back(2);
         
        Solution myS;
        myS.permute(num);
        return 0;
    }
  • 相关阅读:
    BF算法和KMP算法
    Python课程笔记 (五)
    0268. Missing Number (E)
    0009. Palindrome Number (E)
    0008. String to Integer (atoi) (M)
    0213. House Robber II (M)
    0198. House Robber (E)
    0187. Repeated DNA Sequences (M)
    0007. Reverse Integer (E)
    0006. ZigZag Conversion (M)
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3784567.html
Copyright © 2011-2022 走看看