leetcode第一刷_Permutations II

leetcode第一刷_Permutations II

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

当有反复元素的时候呢?

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

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

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

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.net/118003.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JSP入门教程(4)[通俗易懂]

    使用脚本在有些地方,你大概要加一些好的,成熟的程序到你的JSP页里,JSP的标签虽然很强大,但是完成某些工作还是比较费力的困难的。这时你可以使用脚本语言段来补充JSP标签。使用的JSP引擎是支持脚本语言的,SUN的JSP参考文说明,必须使用Java程序语言来编写脚本,但是其他第三方的JSP引擎允许使用其他语言来写脚本程。如何增加脚本首先,你必须了解一些增加脚本元素到JSP页中的一些基本规则

    2022年4月10日
  • CSS flex样式垂直居中

    CSS flex样式垂直居中文章参考Flex布局教程:语法篇问题描述由于div默认是没有高度的,如果设置了高度,默认是从左到右,从上到下的顺序来排布;如果要做垂直居中,就需要计算div控件的高度,如果内容变多或者变少,又会导致定位不准确,因此,最稳妥的办法就是让浏览器自己去根据div的高度居中显示flex个人理解作用自身的样式flex-direction属性决定主轴的方向(即项目的排列方向)flex…

    2022年4月28日
  • 以过来人的身份聊聊实习招聘、秋招、春招(给应届毕业生)

    以过来人的身份聊聊实习招聘、秋招、春招(给应届毕业生)没有学长、学姐能够清楚地告诉我,这些东西的意义。我自己从大三暑期到大四把这三个阶段完整地经历过了,当然因为自己想法多多,心高气傲,无视实习机会,无视秋招。在春招的时候,苦逼求一个面试机会,很多时间就在

    2022年8月3日
  • MySQL之Field ’email’ doesn’t have a default value问题

    MySQL之Field ’email’ doesn’t have a default value问题

    2021年10月20日
  • 线与逻辑与OC门、OD门关系

    线与逻辑与OC门、OD门关系线与逻辑:两个或多个输出信号连接在一起可以实现逻辑“与”的功能。以下图为例:当与非门G1和G2输出都为1时,输出L才为1;只要有一个输出为0,则输出L为0。在硬件上,要用OC门(三极管,集电极开路)或OD门(NMOS,漏极开路)来实现。另外,为了防止灌电流过大,在输出端要加1个上拉电阻。我们先来说说集电极开路输出的结构。集电极开路输出的结构如图1所示,右边的那个三极管集电极什么…

    2022年11月2日
  • Navicat Premium 常用功能讲解

    Navicat Premium 常用功能讲解

    2021年11月9日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号