Leetcode 347. Top K Frequent Elements

Shout out to NeetCode for this solution

# Intuition
Count number of occurences of each number, return the numbers with 
the highest count.

# Approach
Bucket sort. Iterate through array counting occurences 
and storing them in a dictionary. 
Then add the values to a list of lists where
the index of the list is the count of the occurences of that value.

# Code
```
public class Solution 
{
    public int[] TopKFrequent(int[] nums, int k)
    {
        var counts = new Dictionary<int, int>();
        var countsArr = new List<List<int>>();

        for(int i = 0; i < nums.Length; i++)
        {
            //add new list to store numbers for each index
            countsArr.Add(new List<int>());
            //count occurences and add to dictionary
            if(counts.ContainsKey(nums[i]))
            {
                counts[nums[i]]++;
            }
            else
            {
                counts.Add(nums[i], 1);
            }
        }
        //loop through dictionary and add counts to corresponding 
        //index of countsArr
        foreach(var val in counts)
        {
            //add the value - 1 to match zero based index of array
            countsArr[val.Value -1].Add(val.Key);
        }
        //create array to hold result, make it length k
        int[] result = new int[k];
        //keep track of what index in the result we are currently setting
        int curr = 0;
        //loop through countsArr backwards to find biggest results first
        for(int i = countsArr.Count - 1; i >= 0; i--)
        {
           //check if current index has any values
           if(countsArr[i].Count > 0)
           {
               //loop through values at index, adding them to the result
               for(int j = 0; j < countsArr[i].Count; j++)
               {
                  //if curr == k we have added enough numbers
                  // to the result array, so return result
                  if(curr == k)
                  {
                    return result;
                  }
                  //otherwise set the current index of the result array
                  // to the current value
                  result[curr] = countsArr[i][j];
                  //increment current
                  curr++;
               }
           }
        }

        //return result to satisfy method signature
        return result;
    }
}