diff --git a/cs/smallest-range-covering-elements-from-k-lists.cs b/cs/smallest-range-covering-elements-from-k-lists.cs new file mode 100644 index 0000000..484161c --- /dev/null +++ b/cs/smallest-range-covering-elements-from-k-lists.cs @@ -0,0 +1,52 @@ +public class Solution { + private struct Number : IComparable { + public int Value; + public int Index; + + public Number(int value, int index) { + Value = value; + Index = index; + } + + public int CompareTo(Number other) => Value.CompareTo(other.Value); + } + + public int[] SmallestRange(IList> nums) { + var merged = new List(); + for (int i = 0; i < nums.Count; ++i) { + foreach (var num in nums[i]) { + merged.Add(new Number(num, i)); + } + } + + merged.Sort(); + + var freqs = new Dictionary(); + int left = 0, count = 0; + int start = 0, end = int.MaxValue; + + for (int right = 0; right < merged.Count; ++right) { + var num = merged[right]; + + freqs[num.Index] = 1 + freqs.GetValueOrDefault(num.Index, 0); + if (freqs[num.Index] == 1) { + ++count; + } + + for (; count == nums.Count; ++left) { + var range = merged[right].Value - merged[left].Value; + if (range < end - start) { + start = merged[left].Value; + end = merged[right].Value; + } + + --freqs[merged[left].Index]; + if (freqs[merged[left].Index] == 0) { + --count; + } + } + } + + return [start, end]; + } +}