这个看着应该是使用堆排序,但我图了一个简单,所以就简单hash表加选择排序来做了。
使用结构体:

typedef struct node
{struct node *pNext;int value;  // 数值int frequency;  // 频率
}NODE_S;

思路:
hash表用来存储每个值对应的频率,每读到一个数字,对应的频率就加1。
然后从表中再把这些数据读取出来。
先创建两个长度为k的数组,一个用来记录频率,一个用来记录对应的数值。
读取数据的时候,使用频率做排序,在排序的时候,也要对应的交换数值的数组。

/*** Note: The returned array must be malloced, assume caller calls free().*/#define HASH_LEN 10typedef struct node
{struct node *pNext;int value;int frequency;
}NODE_S;NODE_S *get_node(NODE_S **pstHead, int num) // 获取num对应的节点
{int n;NODE_S *pstTemp;if (num<0)n = -num;elsen = num;pstTemp = pstHead[n%HASH_LEN];while(NULL != pstTemp){if (num == pstTemp->value)return pstTemp;elsepstTemp = pstTemp->pNext;}return pstTemp;
}void add_node(NODE_S **pstHashHead, int num)   // 添加一个num的节点
{NODE_S *pstTemp = NULL;NODE_S *pstNode = NULL;int i, n;if (num<0)     // 这里是防止给的num是负数n = -num;elsen = num;pstTemp = get_node(pstHashHead, num);if (NULL == pstTemp){pstTemp = (NODE_S *)calloc(1, sizeof(NODE_S));if (NULL == pstTemp) return;pstTemp->value = num;pstTemp->frequency = 1;pstNode = pstHashHead[n%HASH_LEN];if (NULL == pstNode)pstHashHead[n%HASH_LEN] = pstTemp;   // 说明是第一个节点else{while (NULL != pstNode->pNext) // 往后面继续挂链表{pstNode = pstNode->pNext;}pstNode->pNext = pstTemp;}}else{(pstTemp->frequency) ++; // 已经有该节点,则直接频率加1}return;
}void swap(int *frequency, int *value, int i, int k)  // 交换频率的时候,也要交换对应的数值
{int temp = frequency[i];frequency[i] = frequency[k];frequency[k] = temp;temp = value[i];value[i] = value[k];value[k] = temp;return;
}void selectSort(int *frequency, int *value, int len) // 选择排序
{for(int i=0;i<len-1;i++){int min = frequency[len-1-i];int local = len-1-i;for(int j=0;j<len-1-i;j++){if(min > frequency[j]){min = frequency[j];local = j;}}if(local != (len-1-i))swap(frequency, value, local, len-1-i);}
}int* topKFrequent(int* nums, int numsSize, int k, int* returnSize){NODE_S *pstHashHeadValue[HASH_LEN] = {0};NODE_S *pstTemp = NULL;int *pTmp, i;int *piFrequency = NULL, *piValue = NULL;for (i=0; i<numsSize; i++)  // 把所有元素都插入到hash表中{add_node(pstHashHeadValue, nums[i]);}// 这里生成两个数组,一个频率数组,一个数值数组,频率数组用来排序, 数值数组用来返回piFrequency = (int *)calloc(k, sizeof(int));   if (NULL == piFrequency) return NULL;piValue = (int *)calloc(k, sizeof(int));if (NULL == piValue) return NULL;int count = 0;for (i=0; i<HASH_LEN; i++){if (NULL != pstHashHeadValue[i]){NODE_S *pstTemp = pstHashHeadValue[i];while (NULL != pstTemp){if (count<k){piFrequency[count] = pstTemp->frequency;piValue[count] = pstTemp->value;count ++;if (count == k)selectSort(piFrequency, piValue, k);  // 把数组填满之后,先做一次排序}else{if (pstTemp->frequency > piFrequency[k-1])   // 只有当该频率大于当前存储最小频率的时候,才需要进行重新排序{piFrequency[k-1] = pstTemp->frequency;piValue[k-1] = pstTemp->value;selectSort(piFrequency, piValue, k);}}pstTemp = pstTemp->pNext;}}}*returnSize = k;return piValue;}

转载于:https://www.cnblogs.com/payapa/p/11173705.html

leetcode的Hot100系列--347. 前 K 个高频元素--hash表+直接选择排序相关推荐

  1. 模拟卷Leetcode【普通】347. 前 K 个高频元素

    347. 前 K 个高频元素 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. 示例 1: 输入: nums = [1,1,1,2,2 ...

  2. 【LeetCode】【HOT】347. 前 K 个高频元素(哈希表+优先队列)

    [LeetCode][HOT]347. 前 K 个高频元素 文章目录 [LeetCode][HOT]347. 前 K 个高频元素 package hot;import java.util.Arrays ...

  3. LeetCode——347. 前 K 个高频元素【最小堆实现】

    LeetCode--347. 前 K 个高频元素[最小堆实现] 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. 示例1: 输入: n ...

  4. Leetcode 347. 前 K 个高频元素

    Leetcode 347. 前 K 个高频元素 1.问题分析 2.问题解决 3.总结 1.问题分析 题目链接:https://leetcode-cn.com/problems/top-k-freque ...

  5. Java实现 LeetCode 347 前 K 个高频元素

    347. 前 K 个高频元素 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输 ...

  6. 力扣347 前 K 个高频元素 -- JS

    347. 前 K 个高频元素 - 力扣(LeetCode) (leetcode-cn.com) 一:使用对象进行解题,对象的属性为给定数组的元素,属性值为给定数组元素出现的次数: 二:把对象转成数组, ...

  7. Suzy找到实习了吗Day 13 | 栈和队列结束啦 239. 滑动窗口最大值,347. 前 K 个高频元素

    day 13 239. 滑动窗口最大值 Python的Deque模块详解 solution 我复制的,好难不会写 347. 前 K 个高频元素(一刷我没有用栈,用的哈希法) solution(hash ...

  8. 代码随想录算法训练营day13 | 239. 滑动窗口最大值 | 347.前 K 个高频元素

    一.239. 滑动窗口最大值 from collections import dequeclass MyQueue: #单调队列(从大到小def __init__(self):self.queue = ...

  9. 力扣347.前 K 个高频元素(优先队列)

    347. 前 K 个高频元素 本题的关键点是对map中的value进行排序. 题目中涉及前几个,考虑优先队列 优先队列要通过lamda表达式写清楚是大数在顶还是小数在顶 逆序: PriorityQue ...

最新文章

  1. 那些年你用过哪些消息中间件?为什么又弃了?现在用的是什么?
  2. sybase 珍藏(五)
  3. 【转】winform回车变为tab
  4. 【音视频安卓开发 (二)】
  5. 十九、PHP框架Laravel学习笔记——批量赋值和软删除
  6. pycharm 快捷键2
  7. rbac模型的特点和优势_权限体系设计:融合了组织和岗位的权限模型长啥样?...
  8. VS Code中适用于任何中文字体的中英文混合等宽显示的配置方案
  9. mysql 端口号_mysql的端口号(mysql常用端口号)
  10. 投影仪是计算机的基本配置吗,投影仪如何设置
  11. 论文发表都有哪些期刊
  12. 计算机网络定义记不住,win10下微软拼音输入法记不住自定义输入词语怎么办
  13. mysql rand 范围_MySQL的指定范围随机数函数rand()的使用技巧
  14. Windows搭建web站点:免费内网穿透发布至公网 1-2
  15. 经典书籍--经济 投资 管理 修身 谋略 自传
  16. Android系统电池管理(PowerManagerService)框架分析及其在实体设备和虚拟设备上的差异(一)
  17. 整个canvas玩一玩,做一个简单的水印相机小程序
  18. [转载]Java Web 服务,第 1 部分: Java Web 服务在未来一年内的发展
  19. 关于App的数据统计和分析
  20. GNSS测量与数据处理(2)

热门文章

  1. SQLyog 报错2058 :连接 mysql 8.0.12 解决方法
  2. Jenkins 自动化集成之路 Linux 安装 maven
  3. c# Linq实现 获得某一个路径下所有文件的名(不含扩展名)
  4. 如何设置 Windows 默认命令行窗口大小和缓冲区大小
  5. 如何关闭子线程?征集析构函数与多线程的讨论!
  6. 【零基础学Java】—多线程(四十九)
  7. 解决Node.js 运行的时候出现中文乱码问题
  8. 今天来谈谈CSS有哪些布局
  9. 父亲购房后去世,房产证还没办,后妈和父亲没结婚,户口簿上有父亲,儿子,妹妹,那房产证应该写谁的名字?
  10. 蹲下突然站起来总是会头晕,是什么原因?