You are given n languages numbered from 1 to n, and for each user, a list of languages they know. Some pairs of users are friends but might not share a common language. You can teach one language to some users so that all friends can communicate. Return the minimum number of users you need to teach.
1 <= n <= 5001 <= languages.length <= 5001 <= languages[i].length <= 101 <= languages[i][j] <= n1 <= friendships.length <= 10001 <= friendships[i][j] <= languages.lengthWhy this approach works:
Alternative approaches considered:
Example Input: n = 3, languages = [[1,2],[2,3],[1,3]], friendships = [[1,2],[2,3]]
Step-by-step execution:
Final Answer = 2
import java.util.*;
class Solution {
public int minimumTeachings(int n, int[][] languages, int[][] friendships) {
// Map user to their known languages
HashMap<Integer, Set<Integer>> userLanguage = new HashMap<>();
for (int i = 0; i < languages.length; i++) {
HashSet<Integer> set = new HashSet<>();
for (int lang : languages[i]) {
set.add(lang);
}
userLanguage.put(i + 1, set); // User IDs are 1-based
}
// Find problematic friendships
HashSet<Integer> uniqueProblematicUsers = new HashSet<>();
for (int[] pair : friendships) {
Set<Integer> firstUserLangs = userLanguage.get(pair[0]);
Set<Integer> secondUserLangs = userLanguage.get(pair[1]);
boolean hasCommonLang = firstUserLangs.stream().anyMatch(secondUserLangs::contains);
if (!hasCommonLang) {
uniqueProblematicUsers.add(pair[0]);
uniqueProblematicUsers.add(pair[1]);
}
}
// Try every language and compute minimum teaching effort
int minToTeach = Integer.MAX_VALUE;
for (int lang = 1; lang <= n; lang++) {
int teachCount = 0;
for (int user : uniqueProblematicUsers) {
Set<Integer> knownLanguages = userLanguage.get(user);
if (!knownLanguages.contains(lang)) {
teachCount++;
}
}
minToTeach = Math.min(minToTeach, teachCount);
}
return minToTeach;
}
}