This approach uses a hash map to count the frequency of each element. We then use a min-heap to keep track of the top k elements.
Time Complexity: O(n log n) due to sorting.
Space Complexity: O(n) for storing frequencies.
1using System;
2using System.Collections.Generic;
3using System.Linq;
4
5public class Solution {
6 public int[] TopKFrequent(int[] nums, int k) {
7 var freqMap = new Dictionary<int, int>();
8 foreach (var num in nums) {
9 if (!freqMap.ContainsKey(num))
10 freqMap[num] = 0;
11 freqMap[num]++;
12 }
13
14 return freqMap.OrderByDescending(x => x.Value).Take(k).Select(x => x.Key).ToArray();
15 }
16
17 public static void Main(string[] args) {
18 int[] nums = new int[] {1, 1, 1, 2, 2, 3};
19 int k = 2;
20 Solution sol = new Solution();
21 int[] result = sol.TopKFrequent(nums, k);
22 Console.WriteLine(string.Join(", ", result));
23 }
24}
25
We use a dictionary to count frequencies, then order by descending frequency and take the top k elements.
This approach involves using bucket sort where we create buckets for frequency counts and then extract the top k frequent elements.
Time Complexity: O(n + k).
Space Complexity: O(n).
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4
5#define MAX 10000
6
7typedef struct FreqElem {
8 int value;
9 int count;
10} FreqElem;
11
12int compare(const void *a, const void *b) {
13 return ((FreqElem *)b)->count - ((FreqElem *)a)->count;
14}
15
16int *topKFrequent(int *nums, int numsSize, int k, int *returnSize) {
17 FreqElem buckets[numsSize + 1];
18 memset(buckets, 0, sizeof(buckets));
19
20 for (int i = 0; i < numsSize; ++i) {
21 int found = 0;
22 for (int j = 0; j < numsSize; ++j) {
23 if (buckets[j].count == 0) break;
24 if (buckets[j].value == nums[i]) {
25 buckets[j].count++;
26 found = 1;
27 break;
28 }
29 }
30 if (!found) {
31 for (int j = 0; j < numsSize; ++j) {
32 if (buckets[j].count == 0) {
33 buckets[j].value = nums[i];
34 buckets[j].count = 1;
35 break;
36 }
37 }
38 }
39 }
40
41 qsort(buckets, numsSize, sizeof(FreqElem), compare);
42
43 int *result = (int *)malloc(k * sizeof(int));
44 for (int i = 0; i < k; ++i) {
45 result[i] = buckets[i].value;
46 }
47
48 *returnSize = k;
49 return result;
50}
51
52int main() {
53 int nums[] = {1, 1, 1, 2, 2, 3};
54 int k = 2;
55 int returnSize;
56 int *result = topKFrequent(nums, 6, k, &returnSize);
57 for (int i = 0; i < returnSize; i++) {
58 printf("%d ", result[i]);
59 }
60 free(result);
61 return 0;
62}
63
We manually record each element's frequency and sort the list based on counts into a frequency bucket. Then, we retrieve the top k elements.