【C语言刷LeetCode】347. 前 K 个高频元素(M)

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:

输入: nums = [1], k = 1
输出: [1]
 

提示:

1 <= nums.length <= 105
k 的取值范围是 [1, 数组中不相同的元素的个数]
题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/top-k-frequent-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

UThash  排序HASH_SORT和遍历的用法:

typedef struct {
    int key;
    int val;
    UT_hash_handle hh;
}UT_HASH;

int Cmp(const void *a, const void *b) {
    UT_HASH *x = (UT_HASH *)a;
    UT_HASH *y = (UT_HASH *)b;

    return (x->val < y->val); // 降序排列
}

int* topKFrequent(int* nums, int numsSize, int k, int* returnSize){
    UT_HASH *myhash = NULL;
    int i;
    int *retarr;
    int idx = 0;

    retarr = (int *)malloc(sizeof(int) * k);
    *returnSize = k;

    for (i = 0; i < numsSize; i++) {
        UT_HASH *find = NULL;
        int k = nums[i];

        HASH_FIND_INT(myhash, &k, find);
        if (find != NULL) {
            find->val += 1;
        } else {
            UT_HASH *new = malloc(sizeof(UT_HASH));
            new->key = k;
            new->val = 1;
            HASH_ADD_INT(myhash, key, new);
        }
    }

    HASH_SORT(myhash, Cmp); // hash 排序

    UT_HASH *iter = NULL;
    for (iter = myhash; iter != NULL; iter = iter->hh.next) { // hash 遍历
        retarr[idx++] = iter->key;
        k--;
        if (k == 0) {
            break;
        }
    }

    return retarr;
}

你可能感兴趣的:(LeetCode,leetcode)