Leetcode.1125 最小的必要团队

题目链接

Leetcode.1125 最小的必要团队 Rating : 2251

题目描述

作为项目经理,你规划了一份需求的技能清单 req_skills,并打算从备选人员名单 people中选出些人组成一个「必要团队」( 编号为 i 的备选人员 people[i]含有一份该备选人员掌握的技能列表)。

所谓「必要团队」,就是在这个团队中,对于所需求的技能列表 req_skills中列出的每项技能,团队中至少有一名成员已经掌握。可以用每个人的编号来表示团队中的成员:

  • 例如,团队 team = [0, 1, 3]表示掌握技能分别为 people[0]people[1],和 people[3]的备选人员。

请你返回 任一 规模最小的必要团队,团队成员用人员编号表示。你可以按 任意顺序 返回答案,题目数据保证答案存在。

示例 1:

输入:req_skills = [“java”,“nodejs”,“reactjs”], people = [[“java”],[“nodejs”],[“nodejs”,“reactjs”]]
输出:[0,2]

示例 2:

输入:req_skills = [“algorithms”,“math”,“java”,“reactjs”,“csharp”,“aws”], people = [[“algorithms”,“math”,“java”],[“algorithms”,“math”,“reactjs”],[“java”,“csharp”,“aws”],[“reactjs”,“csharp”],[“csharp”,“math”],[“aws”,“java”]]
输出:[1,2]

提示:

  • 1 < = r e q s k i l l s . l e n g t h < = 16 1 <= req_skills.length <= 16 1<=reqskills.length<=16
  • 1 < = r e q s k i l l s [ i ] . l e n g t h < = 16 1 <= req_skills[i].length <= 16 1<=reqskills[i].length<=16
  • req_skills[i]由小写英文字母组成
  • req_skills中的所有字符串 互不相同
  • 1 < = p e o p l e . l e n g t h < = 60 1 <= people.length <= 60 1<=people.length<=60
  • 0 < = p e o p l e [ i ] . l e n g t h < = 16 0 <= people[i].length <= 16 0<=people[i].length<=16
  • 1 < = p e o p l e [ i ] [ j ] . l e n g t h < = 16 1 <= people[i][j].length <= 16 1<=people[i][j].length<=16
  • people[i][j]由小写英文字母组成
  • people[i]中的所有字符串 互不相同
  • people[i]中的每个技能是 req_skills中的技能
  • 题目数据保证「必要团队」一定存在

解法:状压dp

首先我们先用一个哈希表 s i d sid sidreq_skills中的每一个技能 映射成 对应的下标。比如 req_skills = [ "Java" , "C++" , "JS"],即 "Java" -> 0 , "C++" -> 1 , "JS" -> 2

对于 people,我们可以把 people[i]看作是一个集合 m a s k mask mask。如果 m a s k = 110 1 ( 2 ) mask = 1101_{(2)} mask=1101(2)则说明,该集合能够掌握技能 req_skills[0] , req_skills[2] , req_skills[3]

我们的目的就是 用最少的这样的集合 能够让其掌握 req_skills所有的技能。

接着,我们再使用 01背包 的方式求解。对于每一个集合 people[i],我们只需要讨论 还是 不选

我们定义 f ( i ) f(i) f(i) 为 能够表示 状态 i i i 的最小的集合。按照定义 f ( ( 1 < < m ) − 1 ) f((1 << m) - 1) f((1<<m)1)就是我们的答案,因为我们选择的集合要使 req_skills的每一个技能都被选中,即 m 位二进制数都表示为 1 ,也就是 ( 1 < < m ) − 1 (1 << m) - 1 (1<<m)1

用于我们最终的答案 f ( ( 1 < < m ) − 1 ) f((1 << m) - 1) f((1<<m)1) 所表示的也是一个集合,代表选择了 哪些 people[i]。所以最后我们也要将具体选择的是 哪些 i i i 存入到答案 ans中,最后返回 ans即可。

时间复杂度: O ( 2 m ∗ n + m ) O(2 ^ m * n + m) O(2mn+m)

C++代码:

using LL = long long;
class Solution {
public:
    vector<int> smallestSufficientTeam(vector<string>& req_skills, vector<vector<string>>& people) {
        int m = req_skills.size();
        unordered_map<string,int> sid;
        for(int i = 0;i < m;i++){
            sid[req_skills[i]] = i;
        }

        int n = people.size();
        int u = 1 << m;
        //初始时 每一个状态都表示全集
        vector<LL> f(u , (1LL << n) - 1);
        f[0] = 0; 

        for(int i = 0;i < n;i++){
            int mask = 0;
            for(auto &s:people[i]){
                mask |= (1 << sid[s]);
            }

            for(int j = u - 1;j >= 0;j--){
                //不选 peopele[i]
                auto a = f[j];

                //选 people[i]
                auto b = f[j & (~mask)] | (1LL << i);

                //选择更小的集合
                f[j] = __builtin_popcountll(a) < __builtin_popcountll(b) ? a : b;
            }
        }

        auto res = f[u - 1];

        vector<int> ans;
        for(int i = 0;i < n;i++){
            if((res >> i) & 1) ans.push_back(i);
        }

        return ans;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/7748.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python_Selenium学习笔记(四)】基于Selenium模块实现键盘操作

基于Selenium模块实现键盘操作 前言 在 Selenium 模块中&#xff0c;提供了一个 Keys 类&#xff0c;来处理键盘操作&#xff1b; 在 Selenium 模块中&#xff0c;使用 send_keys() 方法&#xff0c;来模拟键盘输入&#xff0c; 此篇文章主要介绍如何使用 Keys 类 和 send_ke…

vue请求本地JSON文件(注意路径 否则会404)

npm i axios // main.jsimport axios from "axios";Vue.prototype.$axios axios; //全局注册&#xff0c;使用方法为:this.$axios...vue/cli 2 json文件存放目录为 根目录下static/json/aaa.json // 使用getVideoData() {this.$axios.create({baseURL: "&quo…

springboot 部署k8s(二)

系列文章目录 目录 系列文章目录 前言 操作步骤 1.springboot.yaml文件 2.查看deployment 3.查看service服务 4.验证服务 总结 前言 springboot 部署到k8s 上。里面涉及了deployment, Service, NodePort. 操作步骤 1.springboot.yaml文件 apiVersion: apps/v1 kind: …

codeblocks20.3配置wxWidget3.2.2.1

codeblocks20.3 # 英文版自带gcc810&#xff0c;不汉化 wxWidget3.2.2.1 github下载源码 win11专业版 1.下载wxWidget3.2.2.1 源码 2.下载后解压到一个目录中&#xff0c;不要含中文和空格。我放在&#xff1a;d:\wxWidget3.2.2.1 3.打开终端cd build/msw 4.编译wxWidgets 为 …

本行卡转账基本流程说明

1、业务大致流程 2、基本业务描述 大概流程说明&#xff1a;&#xff08;牵涉到调用硬件、不便多说&#xff09; 用户插卡后、选择转账交易、依次输入转入账户卡号和转账金额后&#xff0c;用户确定转账信息&#xff1b;转账交易发送前&#xff1a;需要根据插卡账户信息和转账…

Java基础(四)数组

1. 数组的概述 1.1 为什么需要数组 需求分析1&#xff1a; 需要统计某公司50个员工的工资情况&#xff0c;例如计算平均工资、找到最高工资等。用之前知识&#xff0c;首先需要声明50个变量来分别记录每位员工的工资&#xff0c;这样会很麻烦。因此我们可以将所有的数据全部存…

TCP报文 Flood攻击原理与防御方式

TCP交互过程中包含SYN、SYN-ACK、ACK、FIN和RST报文&#xff0c;这几类报文也可能会被攻击者利用&#xff0c;海量的攻击报文会导致被攻击目标系统资源耗尽、网络拥塞&#xff0c;无法正常提供服务。接下来我们介绍几种常见的Flood攻击的原理和防御方式。 SYN Flood攻击与防御…

【Qt】项目开发遇到问题及解决总结

1.控件的触发&#xff1a;toggle()、triggered()、clicked() 区别&#xff1a; 都是按钮点击后发射的信号 clicked()&#xff1a;用于Button发射的信号triggered()&#xff1a;用于QAction发射的信号&#xff0c; trigger是一次性的。 点击后&#xff0c;无法改变状态。 要么…

【案例教程】基于RWEQ模型的土壤风蚀模数估算及其变化归因分析实践技术

土壤风蚀是一个全球性的环境问题。中国是世界上受土壤风蚀危害最严重的国家之一&#xff0c;土壤风蚀是中国干旱、半干旱及部分湿润地区土地荒漠化的首要过程。中国风蚀荒漠化面积达160.74104km2&#xff0c;占国土总面积的16.7%&#xff0c;严重影响这些地区的资源开发和社会经…

论文笔记|ECCV2022:Self-Promoted Supervision for Few-Shot Transformer

论文地址&#xff1a;https://arxiv.org/abs/2203.07057 代码链接&#xff1a;https://github.com/DongSky/few-shot-vit 这篇论文在2022年发表在ECCV上&#xff0c;论文的题目是用于小样本Transformer的self-promoted supervision&#xff08;自我推荐监督&#xff09; 1 Mot…

求给定集合中好数对的个数

已知一个集合A&#xff0c;对A中任意两个不同的元素求和&#xff0c;若求得的和仍在A内&#xff0c;则称其为好数对。例如&#xff0c;集合A{1 2 3 4}&#xff0c;123&#xff0c;134&#xff0c;则1,2和1,3 是两个好数对。 编写程序求给定集合中好数对的个数。 注&#xff1a;…

java设计模式(1) 适配器模式、装饰器模式

适配器模式 适配器就是一种适配中间件&#xff0c;它存在于不匹配的了两者之间&#xff0c;用于连接两者&#xff0c;使不匹配变得匹配。 手机充电需要将220V的交流电转化为手机锂电池需要的5V直流电 知识补充&#xff1a;手机充电器输入的电流是交流&#xff0c;通过变压整流…

XML复习

目录什么是XMLXML中的内容可以干什么XML文件的创建以及其格式XML的文档约束-DTD约数XML的文档约束-schema约束Dom4J 解析XML 文档什么是XML XML 全称(extensible Markup Lanage) 可扩展标记语言它是一种数据的表示形式, 可以存储复杂的数据格式以及我们自己定义的格式.XML经常…

windows安装ubuntu时错误WslRegisterDistribution failed with error: 0x8007023e的解决方法

cmd或者powershell安装&#xff0c;或者打开linux时 莫名的出现了如下错误&#xff1a; Installing, this may take a few minutes... WslRegisterDistribution failed with error: 0x8007023e Error: 0x8007023e {Application Error} The exception s (0x尝试了很多的方法都不…

Qt图片显示有波纹

现象 Qt中当渲染显示的分辨率比原图片分辨率小时&#xff0c;就会有波纹。如下图所示&#xff0c;左边是正常显示&#xff0c;右边衬衫那里产生严重的波纹。这种波纹在计算机图形学叫摩尔纹&#xff0c;这是纹理贴图采样出现走样的现象&#xff0c;纹理分辨率过大时就会出现这…

解决Windows微信和 PowerToys 的键盘管理器冲突

Windows开机之后PowerToys能正常使用, 但是打开微信之后设置好的快捷键映射就全部失效了 打开微信 -> 左下角三条杠 -> 设置 -> 快捷键 首先我把微信的快捷键全部清空了,发现还是没用 然后发现了设置里默认勾选了检测快捷键,我在想程序肯定是一直在后台检测,而powerTo…

可以计算“如何把程序写好”吗?

其实简单理解这个问题就是“可不可以用机器来判断人的程序写得好不好&#xff1f; 后面我查阅了资料&#xff0c;历史上有一个对计算机领域影响颇深的可计算理论&#xff0c;“计算”应该就来源于这里。其实继续深挖还能找出很多涉及计算机本源的有趣的知识&#xff0c;比如图…

异构计算给我们带来了哪些思考?

虽然异构计算的快速发展给企业创新带来了更加强大的算力支撑&#xff0c;但真正推动异构计算的高速发展和应用落地&#xff0c;笔者认为还需要在以下三个方面做好功课。 从2022年火爆全球的元宇宙&#xff0c;到今年的ChatGPT&#xff0c;以人工智能为代表的科学技术正在创造出…

Unity Animation -- 改进动画效果

使用曲线&#xff08;Curves&#xff09;改善动画 在上一篇笔记中&#xff08;Unity Animation -- Overview_亦枫Leonlew的博客-CSDN博客&#xff09;&#xff0c;我们制作了简单的小球弹跳的动画&#xff0c;但这个动画看起来很不自然&#xff0c;小球的弹跳看起来就像是不受…

Vue3信息提示(Modal)

Vue2信息提示&#xff08;Modal&#xff09; 可自定义设置以下属性&#xff1a; 标题描述&#xff08;title&#xff09;&#xff0c;类型&#xff1a;string&#xff0c;默认 Title 内容描述&#xff08;content&#xff09;&#xff0c;类型&#xff1a;string&#xff0c;…
最新文章