Пример #1
0
            /**
             * initialize your data structure here.
             */
            public MedianFinder()
            {
                _leftOfMedianHeap = BinaryHeap <int> .CreateMaxHeap();

                _rightOfMedianHeap = BinaryHeap <int> .CreateMinHeap();
            }
Пример #2
0
        private int LeastInterval1(char[] tasks, int n)
        {
            // SS: runtime complexity: O(t * n log t )
            // space complexity: O(t)

            var maxHeap1 = BinaryHeap <int> .CreateMaxHeap();

            var maxHeap2 = BinaryHeap <int> .CreateMaxHeap();

            // SS: task buckets
            int[] taskBuckets = new int[26];
            for (int i = 0; i < tasks.Length; i++)
            {
                var task    = tasks[i];
                int taskIdx = task - 'A';
                taskBuckets[taskIdx]++;
            }

            for (int i = 0; i < 26; i++)
            {
                var nTasks = taskBuckets[i];
                if (nTasks > 0)
                {
                    maxHeap1.Push(nTasks);
                }
            }

            int totalTimeUnits = 0;

            while (maxHeap1.IsEmpty == false)
            {
                // SS: number of tasks
                int s1 = maxHeap1.Pop();

                if (s1 > 1)
                {
                    maxHeap2.Push(s1 - 1);
                }

                int timeUnits = 1;

                int distance = n;

                while (distance > 0 && maxHeap1.Length + maxHeap2.Length > 0)
                {
                    if (maxHeap1.IsEmpty == false)
                    {
                        // SS: get next task that is not in conflict
                        int s2 = maxHeap1.Pop();
                        if (s2 > 1)
                        {
                            maxHeap2.Push(s2 - 1);
                        }
                    }

                    timeUnits++;
                    distance--;
                }

                totalTimeUnits += timeUnits;

                while (maxHeap2.IsEmpty == false)
                {
                    int t = maxHeap2.Pop();
                    maxHeap1.Push(t);
                }
            }

            return(totalTimeUnits);
        }