文章目录

  • 1. 题目
  • 2. 解题

1. 题目

在一个由 m 个用户组成的社交网络里,我们获取到一些用户之间的好友关系。
两个用户之间可以相互沟通的条件是他们都掌握同一门语言

给你一个整数 n ,数组 languages 和数组 friendships ,它们的含义如下:

  • 总共有 n 种语言,编号从 1 到 n 。
  • languages[i] 是第 i 位用户掌握的语言集合
  • friendships[i] = [u​​​​​​i​​​, v​​​​​​i] 表示 u​​​​​​​​​​​i​​​​​ 和 vi 为好友关系。

你可以选择 一门 语言并教会一些用户,使得所有好友之间都可以相互沟通。
请返回你 最少 需要教会多少名用户。

请注意,好友关系没有传递性,也就是说如果 x 和 y 是好友,且 y 和 z 是好友, x 和 z 不一定是好友。

示例 1:
输入:n = 2,
languages = [[1],[2],[1,2]],
friendships = [[1,2],[1,3],[2,3]]
输出:1
解释:你可以选择教用户 1 第二门语言,
也可以选择教用户 2 第一门语言。示例 2:
输入:n = 3,
languages = [[2],[1,3],[1,2],[3]],
friendships = [[1,4],[1,2],[3,4],[2,3]]
输出:2
解释:教用户 1 和用户 3 第三门语言,需要教 2 名用户。提示:
2 <= n <= 500
languages.length == m
1 <= m <= 500
1 <= languages[i].length <= n
1 <= languages[i][j] <= n
1 <= u​​​​​​i < v​​​​​​i <= languages.length
1 <= friendships.length <= 500
所有的好友关系 (u​​​​​i, v​​​​​​i) 都是唯一的。
languages[i] 中包含的值互不相同。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-number-of-people-to-teach
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 会做,但是比赛的时候,一个变量写错了,一直过不去。。。

  • 先把每种语言会的人,放在一起,检查关系列表,看每对关系之间是否能交流
  • 枚举每种语言,跳过能沟通的,两个人不会这种语言的,就学习,计数+1
class Solution {public:int minimumTeachings(int n, vector<vector<int>>& languages, vector<vector<int>>& friendships) {int p = languages.size(); // 人数unordered_map<int, unordered_set<int>> lang_peoples;//语言 - 会的人集合for(int i = 0; i < p; i++) {for(auto l : languages[i])lang_peoples[l].insert(i);}vector<bool> canspeak(friendships.size(), false);//能沟通吗for(int i = 0; i < friendships.size(); i++){int a = friendships[i][0]-1, b = friendships[i][1]-1;for(auto& lp : lang_peoples){if(lp.second.count(a) && lp.second.count(b)){canspeak[i] = true;break;}}}// 这里比赛的时候写成了 n-1, 我哭了,我就说逻辑没错啊。。。int teach = p-1, count = 0; //至少要教 p-1个人for(auto& lp : lang_peoples){  // 遍历语言count = 0;for(int i = 0; i < friendships.size(); i++){    // 遍历关系int a = friendships[i][0]-1, b = friendships[i][1]-1;if(canspeak[i])//能沟通的忽略continue;if(!lp.second.count(a)){  //不能沟通,且不会这种语言,学习lp.second.insert(a);count++;}if(!lp.second.count(b)){  //不能沟通,且不会这种语言,学习lp.second.insert(b);count++;}}teach = min(teach, count);}return teach;}
};

812 ms 142.8 MB C++

or

不能沟通的人数,减去,这群人里说的最多的语言的人数,就是最少要教的人

class Solution {public:int minimumTeachings(int n, vector<vector<int>>& languages, vector<vector<int>>& friendships) {int p = languages.size(); // 人数unordered_map<int, unordered_set<int>> lang_peoples;//语言 - 会的人集合for(int i = 0; i < p; i++) {for(auto l : languages[i])lang_peoples[l].insert(i);}vector<bool> canspeak(friendships.size(), false);//能沟通吗for(int i = 0; i < friendships.size(); i++){int a = friendships[i][0]-1, b = friendships[i][1]-1;for(auto& lp : lang_peoples){if(lp.second.count(a) && lp.second.count(b)){canspeak[i] = true;break;}}}vector<int> lang_people_can_say(n,0);unordered_set<int> pp;//不能沟通的人们for(int i = 0; i < friendships.size(); i++){    // 遍历关系if(canspeak[i])//能沟通的忽略continue;int a = friendships[i][0]-1, b = friendships[i][1]-1;if(!pp.count(a)){pp.insert(a);for(auto l : languages[a])lang_people_can_say[l-1]++;//统计不能沟通的人会说的语言}if(!pp.count(b)){pp.insert(b);for(auto l : languages[b])lang_people_can_say[l-1]++;//统计不能沟通的人会说的语言}}return pp.size() - *max_element(lang_people_can_say.begin(),lang_people_can_say.end());}
};

648 ms 138.1 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 1733. 需要教语言的最少人数(哈希+枚举)相关推荐

  1. LeetCode 921. 使括号有效的最少添加(栈)

    1. 题目 给定一个由 '(' 和 ')' 括号组成的字符串 S,我们需要添加最少的括号( '(' 或是 ')',可以在任何位置),以使得到的括号字符串有效. 从形式上讲,只有满足下面几点之一,括号字 ...

  2. C语言联合体/共用体/union,枚举使用大全

    文章目录 一.前言 二.联合体 1.联合体基础 2. 联合体的使用方法和使用场景 2.1 多种访问内存途径共存 2.2 联合体union和大小端(big-endian.little-endian) 2 ...

  3. c语言 英文单词频率统计 哈希存储

    c语言 英文单词频率统计 哈希存储 从一段英文文章中找到频率最大的几个单词,同时统计不同单词个数以及总单词个数,利用哈希进行存储. #include<stdio.h> #include&l ...

  4. Algorithm:C++语言实现之Hash哈希算法相关(dbj2、sdbm、MurmurHash)

    Algorithm:C++语言实现之Hash哈希算法相关(dbj2.sdbm.MurmurHash) 目录 一.Hash知识 1.dbj2​ 2.sdbm​ 3.MurmurHash Hash Has ...

  5. 哈希(散列)(三):C语言实现 动态态哈希表

    哈希(散列)的概念: https://blog.csdn.net/mowen_mowen/article/details/82943192 C语言实现:静态哈希表: https://blog.csdn ...

  6. c语言指针变量输出不了共用体,瘋子C语言札记(结构体/共用体/枚举篇)

    瘋子C语言笔记(结构体/共用体/枚举篇) (一)结构体类型 1.简介: 例: struct date { int month; int day; int year; }; struct student ...

  7. LeetCode 6055. 转化时间需要的最少操作数(贪心)

    文章目录 1. 题目 2. 解题 1. 题目 给你两个字符串 current 和 correct ,表示两个 24 小时制时间 . 24 小时制时间 按 "HH:MM" 进行格式化 ...

  8. LeetCode 1944. 队列中可以看到的人数(单调栈)

    文章目录 1. 题目 2. 解题 1. 题目 有 n 个人排成一个队列,从左到右 编号为 0 到 n - 1 . 给你以一个整数数组 heights ,每个整数 互不相同,heights[i] 表示第 ...

  9. LeetCode 1674. 使数组互补的最少操作次数(差分思想)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个长度为 偶数 n 的整数数组 nums 和一个整数 limit . 每一次操作,你可以将 nums 中的任何整数替换为 1 到 limit 之间的 ...

最新文章

  1. jQuery Autocomplete
  2. Eclipse中Junit测试中@Before不执行
  3. mongodb 监控命令mongostat
  4. hashmap boost
  5. .NET Core 取消令牌:CancellationToken
  6. C++四种强制类型转换
  7. 3.Programming in TensorFlow and Keras
  8. vuex commit 模块_一分钟上手Vuex
  9. 细说 ASP.NET控制HTTP缓存[转]
  10. 1、RabbitMQ初探
  11. 掌财社:传联想控股收身而退 放弃参与高盛投行计划
  12. python爬虫cookie
  13. 白日梦想家(The Secret Life of Walter Mitty)观后
  14. 批量修改文件后缀名(脚本)
  15. 杜永光为你解析脸萌为什么这么红
  16. 高精地图生产中的坐标系
  17. 基于ArcGIS的Python——要素类至地理数据库
  18. 统计:抓虾热文的都是那些网站贡献的?
  19. 甲骨文输掉诉讼官司 或失去美国国防部价值100亿美元云计算合同
  20. Ubuntu 13.10 安装stardict词典(星际译王)

热门文章

  1. 驱动级的自动按键_Aqara全自动智能推拉锁D100,体验全自动开门的便捷
  2. 【养成好习惯】使用pipreqs导出本项目使用的环境
  3. ftp改为sftp_浅谈 FTP、FTPS 与 SFTP
  4. 阿里云rds升级mysql8_为更强大而生的开源关系型数据库来了!阿里云RDS for MySQL 8.0 正式上线!...
  5. 小程序 ajax 加载,小程序实战-小程序网络请求异步加载
  6. 【0802 | Day 7】Python进阶(一)
  7. VS 使用 :新建项目
  8. P3165 [CQOI2014]排序机械臂
  9. linux查看杀死进程
  10. CSS导入使用及引用的两种方法