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;
    }
  • 相关阅读:
    Python批量获取京东商品列表信息
    AxureRP8.1(注册码)破解汉化教程
    sp_getAppLock使用[转]
    rebar3 escriptize
    三层次解析模型(其二):是何、为何、如何
    三层次解析模型(其一):无限、绝对、完美
    wpf项目引入System.Windows.Forms报错
    idea 批量修改
    Android studio 模拟器无法联网问题
    git
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3784567.html
Copyright © 2011-2022 走看看