< Summary

Information
Class: LeetCode.Algorithms.MinimumNumberOfPeopleToTeach.MinimumNumberOfPeopleToTeachGreedyCounting
Assembly: LeetCode
File(s): D:\a\LeetCode-CS\LeetCode-CS\source\LeetCode\Algorithms\MinimumNumberOfPeopleToTeach\MinimumNumberOfPeopleToTeachGreedyCounting.cs
Line coverage
96%
Covered lines: 62
Uncovered lines: 2
Coverable lines: 64
Total lines: 116
Line coverage: 96.8%
Branch coverage
96%
Covered branches: 25
Total branches: 26
Branch coverage: 96.1%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
MinimumTeachings(...)96.15%262696.72%
GetUserLanguageIndex(...)100%11100%

File(s)

D:\a\LeetCode-CS\LeetCode-CS\source\LeetCode\Algorithms\MinimumNumberOfPeopleToTeach\MinimumNumberOfPeopleToTeachGreedyCounting.cs

#LineLine coverage
 1// --------------------------------------------------------------------------------
 2// Copyright (C) 2026 Eugene Eremeev (also known as Yevhenii Yeriemeieiv).
 3// All Rights Reserved.
 4// --------------------------------------------------------------------------------
 5// This software is the confidential and proprietary information of Eugene Eremeev
 6// (also known as Yevhenii Yeriemeieiv) ("Confidential Information"). You shall not
 7// disclose such Confidential Information and shall use it only in accordance with
 8// the terms of the license agreement you entered into with Eugene Eremeev (also
 9// known as Yevhenii Yeriemeieiv).
 10// --------------------------------------------------------------------------------
 11
 12namespace LeetCode.Algorithms.MinimumNumberOfPeopleToTeach;
 13
 14/// <inheritdoc />
 15public sealed class MinimumNumberOfPeopleToTeachGreedyCounting : IMinimumNumberOfPeopleToTeach
 16{
 17    /// <summary>
 18    ///     Time complexity - O(m * n), where m is the number of users and n is the number of languages
 19    ///     Space complexity - O(m * n), where m is the number of users and n is the number of languages
 20    /// </summary>
 21    /// <param name="languagesCount"></param>
 22    /// <param name="languages"></param>
 23    /// <param name="friendships"></param>
 24    /// <returns></returns>
 25    public int MinimumTeachings(int languagesCount, int[][] languages, int[][] friendships)
 226    {
 227        var usersCount = languages.Length;
 28
 229        Span<bool> userLanguages = stackalloc bool[usersCount * languagesCount];
 30
 1831        for (var i = 0; i < usersCount; i++)
 732        {
 4133            foreach (var language in languages[i])
 1034            {
 1035                userLanguages[GetUserLanguageIndex(i, language - 1, languagesCount)] = true;
 1036            }
 737        }
 38
 239        Span<bool> usersToTeach = stackalloc bool[usersCount];
 40
 241        Span<int> usersToTeachIndices = stackalloc int[usersCount];
 42
 243        var usersToTeachCount = 0;
 44
 2045        foreach (var friendship in friendships)
 746        {
 747            var userA = friendship[0] - 1;
 748            var userB = friendship[1] - 1;
 49
 750            var isOverlap = false;
 51
 3852            for (var language = 0; language < languagesCount; language++)
 1553            {
 1554                if (!userLanguages[GetUserLanguageIndex(userA, language, languagesCount)] ||
 1555                    !userLanguages[GetUserLanguageIndex(userB, language, languagesCount)])
 1256                {
 1257                    continue;
 58                }
 59
 360                isOverlap = true;
 61
 362                break;
 63            }
 64
 765            if (isOverlap)
 366            {
 367                continue;
 68            }
 69
 470            if (!usersToTeach[userA])
 371            {
 372                usersToTeach[userA] = true;
 373                usersToTeachIndices[usersToTeachCount] = userA;
 374                usersToTeachCount++;
 375            }
 76
 477            if (!usersToTeach[userB])
 378            {
 379                usersToTeach[userB] = true;
 380                usersToTeachIndices[usersToTeachCount] = userB;
 381                usersToTeachCount++;
 382            }
 483        }
 84
 285        if (usersToTeachCount == 0)
 086        {
 087            return 0;
 88        }
 89
 290        var mostCommonLanguageCount = 0;
 91
 1492        for (var language = 0; language < languagesCount; language++)
 593        {
 594            var currentLanguageCount = 0;
 95
 4296            for (var i = 0; i < usersToTeachCount; i++)
 1697            {
 1698                var user = usersToTeachIndices[i];
 99
 16100                if (userLanguages[GetUserLanguageIndex(user, language, languagesCount)])
 8101                {
 8102                    currentLanguageCount++;
 8103                }
 16104            }
 105
 5106            mostCommonLanguageCount = Math.Max(mostCommonLanguageCount, currentLanguageCount);
 5107        }
 108
 2109        return usersToTeachCount - mostCommonLanguageCount;
 2110    }
 111
 112    private static int GetUserLanguageIndex(int user, int language, int languagesCount)
 49113    {
 49114        return (user * languagesCount) + language;
 49115    }
 116}