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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术