public int MinMeetingRooms(Interval[] intervals) { Array.Sort(intervals, new Comparison <Interval>((i1, i2) => i2.start.CompareTo(i1.start))); var rooms = new MinHeap(int.MaxValue); foreach (var interval in intervals) { if (rooms.PeekMin() <= interval.start) { rooms.ExtractMin(); rooms.InsertKey(interval.end); } else { rooms.InsertKey(interval.end); } } return(rooms._data.Count); }
// head1 -> 1 -> 2 -> 3 // head2 -> 7 -> 9 -> 11 // head3 -> 4 -> 6 -> 10 public ListNode MergeKLists(ListNode[] lists) { var dummyHead = new ListNode(-1); var runner = dummyHead; var minHeap = new MinHeap(); for (var head = 0; head < lists.Length; head++) { if (lists[head] != null) { minHeap.Insert(new HeapItem() { data = lists[head].val, listIndex = head }); lists[head] = lists[head].next; } } while (minHeap.Count() > 0) { var minFromHeap = minHeap.ExtractMin(); var minItemListNextNode = lists[minFromHeap.listIndex]; if (minItemListNextNode != null) { minHeap.Insert(new HeapItem() { data = minItemListNextNode.val, listIndex = minFromHeap.listIndex }); lists[minFromHeap.listIndex] = lists[minFromHeap.listIndex].next; } var node = new ListNode(minFromHeap.data); runner.next = node; runner = runner.next; } return(dummyHead.next); }