using System.Collections.Generic;
public static void Main()
string[] arr = new string[] { "a", "c", "b", "z", "d", "g", "z", "g", "f", "d", "z", "z" };
var result=GetTopTwoproducts(arr,3);
foreach(var product in result)
Console.WriteLine(product);
public static List<string> GetTopTwoproducts(string[] products, int k)
List<string> Top2 = new List<string>();
Dictionary<string, int> prodCounts = new Dictionary<string, int>();
foreach (var product in products)
if (prodCounts.ContainsKey(product))
prodCounts.Add(product, 1);
foreach (var key in prodCounts.Keys)
var minHeap = new MinHeap(prodCounts[key], key);
HeapOperations.Enqueue(minHeap);
HeapOperations.Replace(minHeap);
var result = HeapOperations.Get();
foreach (var p in result)
public MinHeap(int prodCount, string product)
this.prodCount = prodCount;
public class HeapOperations
public static MinHeap[] minHeap;
public static MinHeap[] Get()
public static int GetParentIndex(int index)
else if (index == 1 || index == 2)
public static int GetLeftIndex(int index)
public static int GetRightIndex(int index)
public static void Enqueue(MinHeap prod)
minHeap = new MinHeap[3];
HeapOperations.minHeap[0] = prod;
minHeap[lastIndex] = prod;
public static void Replace(MinHeap prod)
if (minHeap[lastIndex].prodCount < prod.prodCount)
minHeap[lastIndex] = prod;
public static void HeapifyUp(int lastIndex)
int parentIndex = GetParentIndex(lastIndex);
if (minHeap[parentIndex] == null)
Swap(minHeap, parentIndex, lastIndex);
else if (minHeap[parentIndex].prodCount > minHeap[lastIndex].prodCount)
Swap(minHeap, parentIndex, lastIndex);
public static void HeapifyDown()
int leftIndex = GetLeftIndex(lastIndex);
int rightIndex = GetRightIndex(lastIndex);
while (lastIndex <= minHeap.Length - 1 && leftIndex<= minHeap.Length - 1 && rightIndex<= minHeap.Length - 1)
if (minHeap[leftIndex] != null && minHeap[lastIndex].prodCount > minHeap[leftIndex].prodCount)
Swap(minHeap, lastIndex, leftIndex);
else if (minHeap[rightIndex] != null && minHeap[lastIndex].prodCount > minHeap[rightIndex].prodCount)
Swap(minHeap, lastIndex, rightIndex);
if (lastIndex < leftIndex && lastIndex < rightIndex)
leftIndex = GetLeftIndex(lastIndex);
rightIndex = GetRightIndex(lastIndex);
public static void Swap(MinHeap[] arr, int i, int j)