您也可以使用SortedSet
with 重复项。不是将值存储在集合中,而是存储列表的索引,然后在比较重复项时使用索引作为区分因素。
List<int> nums = new List<int>{1,2,1,3,3,2};
SortedSet<int> pq = new SortedSet<int>(Comparer<int>.Create(
(x,y) => nums[x] != nums[y] ? nums[x]-nums[y] : x-y
));
for (int i=0; i<nums.Count; i++) pq.Add(i);
while (pq.Any())
{
Console.Write(nums[pq.Min] + " ");
pq.Remove(pq.Min);
}
https://dotnetfiddle.net/Egg3oN
编辑:
我重用了上面相同的代码来添加 OP 要求的两种方法
public static void Main()
{
List<int> nums = new List<int>{1,2,1,3,3,2};
SortedSet<int> pq = new SortedSet<int>(Comparer<int>.Create(
(x,y) => nums[x] != nums[y] ? nums[x]-nums[y] : x-y
));
for (int i=0; i<nums.Count; i++) Enqueue(pq, i);
while (pq.Any())
{
int topIndex = Dequeue(pq);
Console.Write(nums[topIndex] + " ");
}
}
private static void Enqueue(SortedSet<int> pq, int numIndex)
{
pq.Add(numIndex);
}
private static int Dequeue(SortedSet<int> pq)
{
int topIndex = pq.Min;
pq.Remove(pq.Min);
return topIndex;
}