347. 前 K 个高频元素

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

示例 1:

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

示例 2:

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

提示:

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

进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。

代码:

暴力解法,部分测试用例时间超时,通过的测试用例20/21
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
typedef struct {
int val;
int count;
} node;
int* topKFrequent(int* nums, int numsSize, int k, int* returnSize) {
// nums排序
for (int i = 1; i <= numsSize - 1; i++) {
for (int j = 0; j <= numsSize - 1 - i; j++) {
if (nums[j] > nums[j + 1]) {
int tmp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = tmp;
}
}
}
// 定义一个结构体数组/栈
node* arr = (node*)malloc(sizeof(node) * 10000);
int top = 0;
// 求每个数字出现的次数
if (numsSize >= 2) {
for (int i = 0; i <= numsSize - 2;) {
int c = 1;
int j = i;
while (j <= numsSize - 2 && nums[j] == nums[j + 1]) {
++j;
++c;
}
node tmp;
tmp.val = nums[i];
tmp.count = c;
arr[top++] = tmp;
i = j + 1;
}
if (nums[numsSize - 1] != nums[numsSize - 2]) {
node tmp;
tmp.val = nums[numsSize - 1];
tmp.count = 1;
arr[top++] = tmp;
}
} else {
node tmp;
tmp.val = nums[0];
tmp.count = 1;
arr[top++] = tmp;
}
// 对结构体数组按照count为关键字进行降序冒泡排序
for (int i = 1; i <= top - 1; i++) {
for (int j = 0; j <= top - 1 - i; j++) {
if (arr[j].count < arr[j + 1].count) {
node tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
// 找前k个元素
*returnSize = 0;
int* res = (int*)malloc(sizeof(int) * k);
for (int i = 0; i < k; i++) {
res[(*returnSize)++] = arr[i].val;
}
return res;
}
posted @   有空  阅读(4)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示