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)
上一篇 2021年12月14日 下午10:00
下一篇 2021年12月14日 下午11:00


相关推荐

  • a算法解决八数码实验报告_人工智能常用算法模型

    a算法解决八数码实验报告_人工智能常用算法模型实验一A*算法求解8数码问题一、实验目的熟悉和掌握启发式搜索的定义、估价函数和算法过程,并利用A*算法求解N数码难题,理解求解流程和搜索顺序。二、实验原理A*算法是一种启发式图搜索算法,其特点在于对估价函数的定义上。对于一般的启发式图搜索,总是选择估价函数f值最小的节点作为扩展节点。因此,f是根据需要找到一条最小代价路径的观点来估算节点的,所以,可考虑每个节点n的估价函数值为两个分量:从起始节点到节点n的实际代价g(n)以及从节点n到达目标节点的估价代价h(n),且hn≤h*n,h*n

    2025年6月14日
    2
  • 太上老君内观经

    太上老君内观经老君曰 天地媾精 阴阳布化 万物以生 承其宿业 分灵道一 父母和合 人受其生 始 一月为胞 精血凝也 二月成胎 形兆胚也 三月阳神为三魂 动而生也 四月阴灵为七魄 静镇形也 五月 五行分藏以安神也 六月 六律定腑用滋灵也 七月 七精开窍 通光明也 八月 八景神具 降真灵也 九月 宫室罗布 以定精也 十月气足 万象成也 元和哺食 时不停也 nbsp 太一帝君在头 曰泥丸君 总众神也 照生识神

    2026年3月19日
    2
  • python py库安装_pygame怎么用

    python py库安装_pygame怎么用最详细python安装库的方法!!!到此第一种方法结束第二种方法(在终端安装库)win+r:打开运行输入cmd然后cd到你的python解释器下的scripts中(比如我的路径是D:\ProgramFiles(x86)\python\Scripts)找到这个路径后下面就开始安装cd到了scripts中就输入以下三个任意一个进行库的安装安装pipinstall………

    2022年10月2日
    6
  • IdentityServer4密码模式

    IdentityServer4密码模式Oatuth2 协议的密码模式介绍 用户会将用户名 密码给予客户端 但是客户端不保存此信息 客户端带着用户的密码请求认证服务器 认证服务器密码验证通过后后将 token 返回给客户端 这里借用下阮一峰老师画的图 博客地址 http www ruanyifeng com blog 2014 05 oauth 2 0 html IdentityServ 密码模式实现 我们不需要修改资源服务器 我们在客户端模式下的认证服务器的 Confi

    2026年3月19日
    1
  • java backoff_Java BackOff类代码示例

    java backoff_Java BackOff类代码示例importorg.apache.beam.sdk.util.BackOff;//导入依赖的package包/类/***WritesabatchofmutationstoCloudDatastore.**Ifacommitfails,itwillberetriedupto{@link#MAX_RETRIES}times.All*mutations…

    2022年6月30日
    38
  • GLM-4.1V-Thinking:开源视觉推理模型,支持多模态复杂任务

    GLM-4.1V-Thinking:开源视觉推理模型,支持多模态复杂任务

    2026年3月12日
    5

发表回复

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

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