NeetCode 150 / Arrays & Hashing
MediumArrays & HashingO(n)
ভিডিওতে দেখো — YouTube @algonur_com

কোড

Python
def topKFrequent(nums: list[int], k: int) -> list[int]:
    from collections import Counter
    count = Counter(nums)
    bucket = [[] for _ in range(len(nums) + 1)]
    for num, freq in count.items():
        bucket[freq].append(num)
    res = []
    for i in range(len(bucket) - 1, 0, -1):
        for num in bucket[i]:
            res.append(num)
            if len(res) == k: return res
Java
public int[] topKFrequent(int[] nums, int k) {
    Map<Integer,Integer> count = new HashMap<>();
    for (int n : nums) count.merge(n, 1, Integer::sum);
    List<Integer>[] bucket = new List[nums.length + 1];
    for (int key : count.keySet()) {
        int f = count.get(key);
        if (bucket[f] == null) bucket[f] = new ArrayList<>();
        bucket[f].add(key);
    }
    int[] res = new int[k]; int idx = 0;
    for (int i = bucket.length - 1; i > 0 && idx < k; i--)
        if (bucket[i] != null) for (int n : bucket[i]) if (idx < k) res[idx++] = n;
    return res;
}
Kotlin
fun topKFrequent(nums: IntArray, k: Int): IntArray {
    val count = nums.groupBy { it }.mapValues { it.value.size }
    return count.entries.sortedByDescending { it.value }.take(k).map { it.key }.toIntArray()
}
C++
vector<int> topKFrequent(vector<int>& nums, int k) {
    unordered_map<int,int> cnt;
    for (int n : nums) cnt[n]++;
    vector<vector<int>> bucket(nums.size() + 1);
    for (auto& [num, freq] : cnt) bucket[freq].push_back(num);
    vector<int> res;
    for (int i = bucket.size()-1; i >= 0 && res.size() < k; i--)
        for (int n : bucket[i]) { res.push_back(n); if (res.size()==k) return res; }
    return res;
}
C
int cmpFreq(const void* a, const void* b) {
    int* x = (int*)a; int* y = (int*)b;
    return y[1] - x[1];
}
int* topKFrequent(int* nums, int numsSize, int k, int* returnSize) {
    // count frequencies with O(n²) scan
    int uniq[numsSize][2]; int uLen = 0;
    for (int i = 0; i < numsSize; i++) {
        int found = 0;
        for (int j = 0; j < uLen; j++) if (uniq[j][0]==nums[i]) { uniq[j][1]++; found=1; break; }
        if (!found) { uniq[uLen][0]=nums[i]; uniq[uLen][1]=1; uLen++; }
    }
    qsort(uniq, uLen, sizeof(uniq[0]), cmpFreq);
    int* res = (int*)malloc(k*sizeof(int));
    for (int i = 0; i < k; i++) res[i] = uniq[i][0];
    *returnSize = k; return res;
}

জটিলতা

O(n)
সময় — অ্যারেটা একবারই ঘুরি, ম্যাপে খোঁজা O(1)।
O(n)
জায়গা — সবচেয়ে খারাপ ক্ষেত্রে সব সংখ্যা ম্যাপে থাকে।
আগের সমস্যা← Group Anagramsপরের সমস্যাEncode and Decode Strings →