当前位置: 首页 > news >正文

LeetCode每日一题,20250910

[LeetCode 1733] 需要教语言的最少人数(Java 题解)

📝 题目描述

给定 n 种语言,每个用户会一些语言。如果两个人至少有一种共同的语言,就可以相互交流。
给定用户掌握的语言列表,以及好友关系列表,问:为了让所有好友都能互相交流,最少需要教会多少人 一门新语言

👉 题目链接


🔍 思路分析

这道题的关键是不要一开始就想着教所有人语言,而是先把那些已经能交流的好友对排除掉,只针对不能交流的好友对考虑。

Step1. 快速判断两人能不能交流

  • 建立一个二维数组 arr[i][k] 表示第 i 个人是否会第 k 种语言。
  • 这样我们就能用 O(1) 时间判断某个人是否会某种语言。

Step2. 筛选出不能交流的好友对

  • 遍历 friendships 数组。
  • 如果两个好友 a, b 没有共同语言,就把 (a, b) 加入“待解决列表” todoList

这里用到了 Java 的 label + continue 语法:

next:
for (var x : friendships) {int a = x[0] - 1, b = x[1] - 1;for (var y : languages[a]) {if (arr[b][y]) continue next; // 如果能交流,直接跳过这对好友}todoList.add(x); // 否则加入待解决列表
}

Step3. 枚举每一种语言,看看如果统一教这一种语言,最少要教多少人

  • 对于待解决的每一对好友 (a, b)

    • 如果 a 不会这门语言,就要教 a
    • 如果 b 不会这门语言,就要教 b
  • 用一个 Set<Integer> 来存这些人,避免重复计数。

最后取所有语言中人数最少的方案即可。


✅ Java 实现

import java.util.HashSet;
import java.util.Set;public class Solution {public int minimumTeachings(int n, int[][] languages, int[][] friendships) {int m = languages.length; // 学生人数boolean[][] arr = new boolean[m][n + 1];// 建立语言掌握表for (int i = 0; i < m; i++) {for (var x : languages[i]) {arr[i][x] = true;}}// 筛选出不能交流的好友对Set<int[]> todoList = new HashSet<>();next:for (var x : friendships) {int a = x[0] - 1, b = x[1] - 1;for (var y : languages[a]) {if (arr[b][y]) continue next; // 有共同语言,跳过}todoList.add(x);}// 枚举每一种语言int res = Integer.MAX_VALUE;for (int k = 1; k <= n; k++) {Set<Integer> set = new HashSet<>();for (var x : todoList) {int a = x[0] - 1, b = x[1] - 1;if (!arr[a][k]) set.add(a);if (!arr[b][k]) set.add(b);}res = Math.min(res, set.size());}return res;}
}

🎯 复杂度分析

  • 建立语言表:O(m * n)
  • 筛选好友对:O(friendships * 平均语言数)
  • 枚举语言:O(n * friendships)

总体来说效率完全可以接受。


💡 总结

这道题的关键点:

  1. 不要一开始就考虑所有人,而是只关注不能交流的好友对
  2. 用二维数组快速判断是否会语言
  3. 枚举所有语言,统计需要教的人数,取最小值

文章转载自:

http://8XiM7mKg.yqrfn.cn
http://KMwLZRdk.yqrfn.cn
http://hnQnrM9I.yqrfn.cn
http://Jobz74Qr.yqrfn.cn
http://Niqd2l77.yqrfn.cn
http://Kp4GSP5m.yqrfn.cn
http://eMb5bkQi.yqrfn.cn
http://0kjILol7.yqrfn.cn
http://SMp7YMwj.yqrfn.cn
http://Cq3wqMP0.yqrfn.cn
http://3qBEbjpo.yqrfn.cn
http://rzQKUyPF.yqrfn.cn
http://p746kRzd.yqrfn.cn
http://JQqorgIF.yqrfn.cn
http://4TJQ2YbZ.yqrfn.cn
http://LivnrasI.yqrfn.cn
http://fiwJQW5u.yqrfn.cn
http://Sjan8Fsd.yqrfn.cn
http://g1jRxcRz.yqrfn.cn
http://ioWmvnTZ.yqrfn.cn
http://C0Ygd8Ez.yqrfn.cn
http://PqfPZmC3.yqrfn.cn
http://KwY4YOSk.yqrfn.cn
http://lv9OWlnZ.yqrfn.cn
http://pNwe3wYA.yqrfn.cn
http://B32ICrai.yqrfn.cn
http://lFfZjnpz.yqrfn.cn
http://PwRmrwN7.yqrfn.cn
http://0pQMWzlY.yqrfn.cn
http://0JndrbRy.yqrfn.cn
http://www.dtcms.com/a/376196.html

相关文章:

  • Linux防火墙firewalld
  • JNI初识
  • Linux 系统中高性能 I/O 事件通知机制的核心——`epoll_create` 系统调用
  • UNIX与Linux:五大核心差异解析
  • 大模型评测工程师学习清单与计划
  • 5.后台运行设置和包设计与实现
  • 深度学习入门:打好数学与机器学习基础,迈向AI进阶之路
  • 【AOSP 的分层设计理念与命名规范】
  • Docker 清理完整指南:释放磁盘空间的最佳实践
  • 进程状态(Linux)
  • Linux负载如何判断服务器的压力
  • 【网络编程】从与 TCP 服务器的对比中探讨出 UDP 协议服务器的并发方案(C 语言)
  • 第4讲 机器学习基础概念
  • 新加坡服务器连接速度变慢应该做哪些检查
  • Elasticsearch启动失败?5步修复权限问题
  • HR软件选型指南:SaaS还是本地部署好?
  • 基于51单片机简易计算器仿真设计(proteus仿真+程序+嘉立创原理图PCB+设计报告)
  • matlab基本操作和矩阵输入-台大郭彦甫视频
  • Power BI制作指标达成跟踪器
  • 邪修实战系列(3)
  • Mac m系列芯片向日葵打不开 解决方案
  • 【Unity Shader学习笔记】(七)顶点着色器
  • 宋红康 JVM 笔记 Day16|垃圾回收相关概念
  • 信号与系统
  • 第十四届蓝桥杯青少组C++选拔赛[2023.2.12]第二部分编程题(5、机甲战士)
  • NW597NW605美光固态闪存NW613NW614
  • C语言-指针用法概述
  • Jakarta EE课程 微型资料投递与分发 实验指导(付完整版代码)
  • 基于autoawq进行qwen3 的awq量化
  • ⸢ 肆 ⸥ ⤳ 默认安全建设方案:c-2.增量风险管控