< Summary

Information
Class: LeetCode.Algorithms.DesignTaskManager.DesignTaskManagerDictionaryWithPriorityQueue
Assembly: LeetCode
File(s): D:\a\LeetCode-CS\LeetCode-CS\source\LeetCode\Algorithms\DesignTaskManager\DesignTaskManagerDictionaryWithPriorityQueue.cs
Line coverage
90%
Covered lines: 56
Uncovered lines: 6
Coverable lines: 62
Total lines: 148
Line coverage: 90.3%
Branch coverage
70%
Covered branches: 7
Total branches: 10
Branch coverage: 70%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%22100%
Add(...)100%11100%
Edit(...)100%11100%
Rmv(...)100%11100%
ExecTop()66.66%6691.66%
get_UserId()100%11100%
get_TaskId()100%11100%
get_Priority()100%11100%
.ctor(...)100%11100%
CompareTo(...)50%2271.42%
CompareToPriority(...)100%11100%
CompareToTaskId(...)100%210%

File(s)

D:\a\LeetCode-CS\LeetCode-CS\source\LeetCode\Algorithms\DesignTaskManager\DesignTaskManagerDictionaryWithPriorityQueue.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.DesignTaskManager;
 13
 14/// <inheritdoc />
 15public sealed class DesignTaskManagerDictionaryWithPriorityQueue : IDesignTaskManager
 16{
 117    private readonly PriorityQueue<TaskIdPriority, TaskIdPriority> _taskIdPriorityQueue = new();
 118    private readonly Dictionary<int, UserIdPriority> _taskIdToUserIdPriorityDictionary = [];
 19
 20    /// <summary>
 21    ///     Time complexity - O(n log n)
 22    ///     Space complexity - O(n)
 23    /// </summary>
 24    /// <param name="tasks"></param>
 125    public DesignTaskManagerDictionaryWithPriorityQueue(IList<IList<int>> tasks)
 126    {
 127        var n = tasks.Count;
 28
 829        for (var i = 0; i < n; i++)
 330        {
 331            var userId = tasks[i][0];
 332            var taskId = tasks[i][1];
 333            var priority = tasks[i][2];
 34
 335            _taskIdToUserIdPriorityDictionary.Add(taskId, new UserIdPriority(userId, priority));
 36
 337            var taskIdPriority = new TaskIdPriority(taskId, priority);
 38
 339            _taskIdPriorityQueue.Enqueue(taskIdPriority, taskIdPriority);
 340        }
 141    }
 42
 43    /// <summary>
 44    ///     Time complexity - O(log n)
 45    ///     Space complexity - O(1)
 46    /// </summary>
 47    /// <param name="userId"></param>
 48    /// <param name="taskId"></param>
 49    /// <param name="priority"></param>
 50    public void Add(int userId, int taskId, int priority)
 251    {
 252        _taskIdToUserIdPriorityDictionary[taskId] = new UserIdPriority(userId, priority);
 53
 254        var taskIdPriority = new TaskIdPriority(taskId, priority);
 55
 256        _taskIdPriorityQueue.Enqueue(taskIdPriority, taskIdPriority);
 257    }
 58
 59    /// <summary>
 60    ///     Time complexity - O(log n)
 61    ///     Space complexity - O(1)
 62    /// </summary>
 63    /// <param name="taskId"></param>
 64    /// <param name="newPriority"></param>
 65    public void Edit(int taskId, int newPriority)
 166    {
 167        var userIdPriority = _taskIdToUserIdPriorityDictionary[taskId];
 168        var editedUserIdPriority = userIdPriority with { Priority = newPriority };
 69
 170        _taskIdToUserIdPriorityDictionary[taskId] = editedUserIdPriority;
 71
 172        var taskIdPriority = new TaskIdPriority(taskId, newPriority);
 73
 174        _taskIdPriorityQueue.Enqueue(taskIdPriority, taskIdPriority);
 175    }
 76
 77    /// <summary>
 78    ///     Time complexity - O(1)
 79    ///     Space complexity - O(1)
 80    /// </summary>
 81    /// <param name="taskId"></param>
 82    public void Rmv(int taskId)
 383    {
 384        _taskIdToUserIdPriorityDictionary.Remove(taskId);
 385    }
 86
 87    /// <summary>
 88    ///     Time complexity - O(log n)
 89    ///     Space complexity - O(1)
 90    /// </summary>
 91    /// <returns></returns>
 92    public int ExecTop()
 293    {
 394        while (_taskIdPriorityQueue.Count > 0)
 395        {
 396            var taskIdPriority = _taskIdPriorityQueue.Dequeue();
 97
 398            if (!_taskIdToUserIdPriorityDictionary.TryGetValue(taskIdPriority.TaskId, out var userIdPriority) ||
 399                userIdPriority.Priority != taskIdPriority.Priority)
 1100            {
 1101                continue;
 102            }
 103
 2104            Rmv(taskIdPriority.TaskId);
 105
 2106            return userIdPriority.UserId;
 107        }
 108
 0109        return -1;
 2110    }
 111
 6112    private readonly record struct UserIdPriority(int UserId, int Priority);
 113
 114    private readonly struct TaskIdPriority : IComparable<TaskIdPriority>
 115    {
 5116        public int TaskId { get; }
 117
 27118        public int Priority { get; }
 119
 120        public TaskIdPriority(int taskId, int priority)
 6121        {
 6122            TaskId = taskId;
 6123            Priority = priority;
 6124        }
 125
 126        public int CompareTo(TaskIdPriority taskPriority)
 12127        {
 12128            var priorityCompare = CompareToPriority(taskPriority.Priority);
 129
 12130            if (priorityCompare == 0)
 0131            {
 0132                return CompareToTaskId(taskPriority.TaskId);
 133            }
 134
 12135            return priorityCompare;
 12136        }
 137
 138        private int CompareToPriority(int priority)
 12139        {
 12140            return priority.CompareTo(Priority);
 12141        }
 142
 143        private int CompareToTaskId(int taskId)
 0144        {
 0145            return taskId.CompareTo(TaskId);
 0146        }
 147    }
 148}