前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >leetcode第一刷_Permutations II

leetcode第一刷_Permutations II

作者头像
全栈程序员站长
发布2021-12-15 09:10:34
1950
发布2021-12-15 09:10:34
举报
文章被收录于专栏:全栈程序员必看

当有反复元素的时候呢?

不用拍脑袋都会想到一种方法,也是全部有反复元素时的通用处理方法,维护一个set,假设这个元素没增加过就增加,增加过了的忽略掉。可是,在这道题上这个通用方法竟然超时了!

怎么办?想一下为什么会这样,如果我们要排列的数字是1111112,当当前的排列中没有1时,取哪个1生成一遍,都是一样的。仅仅有当前面的1都用过了,必须轮到这个1出场的时候,它才会有价值。更明白一点说,如果我们要在生成的排列中放两个1,那么这两个1是原来的哪两个根本无所谓,不断的选,终于的结果肯定一样,可是当我们要在排列中放3个1的时候,再选择的1一定是新的了,是有意义的。

用算法的语言描写叙述就是,先把全部的候选数字排一下序,同样的数字会挨在一起,对于同样的数字,都先取第一个增加排列,后面的同样的数字想增加排列,必须保证它前面的同样数字已经在排列中了,这样避免了不断生成反复的排列。

代码语言:javascript
复制
class Solution {
public:
    set<vector<int> > vis;
    void getPerm(vector<int> &num, vector<int> &tpres, vector<vector<int> > &res, int len, int n, bool *visited){
        if(len == n){
            if(vis.find(tpres) == vis.end()){
                vis.insert(tpres);
                res.push_back(tpres);
            }
            return;
        }
        for(int i=0;i<n;i++){
            if(!visited[i]){
                if(i!=0&&num[i] == num[i-1]&&!visited[i-1])
                    continue;
                visited[i] = 1;
                tpres.push_back(num[i]);
                getPerm(num, tpres, res, len+1, n, visited);
                visited[i] = 0;
                tpres.pop_back();
            }
        }
    }
    vector<vector<int> > permuteUnique(vector<int> &num) {
        vector<vector<int> > res;
        vector<int> tpres;
        int msize = num.size();
        if(msize<=0)    return res;
        bool visited[msize];
        memset(visited, 0, sizeof(visited));
        sort(num.begin(), num.end());
        getPerm(num, tpres, res, 0, msize, visited);
        return res;
    }
};

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/118003.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档