leetcode的Hot100系列--347. 前 K 个高频元素--hash表+直接选择排序
这个看着应该是使用堆排序,但我图了一个简单,所以就简单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 10
typedef 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;
else
n = num;
pstTemp = pstHead[n%HASH_LEN];
while(NULL != pstTemp)
{
if (num == pstTemp->value)
return pstTemp;
else
pstTemp = 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;
else
n = 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;
}
leetcode的Hot100系列--347. 前 K 个高频元素--hash表+直接选择排序的更多相关文章
- Java实现 LeetCode 347 前 K 个高频元素
347. 前 K 个高频元素 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输 ...
- 力扣 - 347. 前 K 个高频元素
目录 题目 思路1(哈希表与排序) 代码 复杂度分析 思路2(建堆) 代码 复杂度分析 题目 347. 前 K 个高频元素 思路1(哈希表与排序) 先用哈希表记录所有的值出现的次数 然后将按照出现的次 ...
- 代码随想录第十三天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素
第一题150. 逆波兰表达式求值 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 注意 两个整数之间的除法只保留整数部分. ...
- [LeetCode]347. 前 K 个高频元素(堆)
题目 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1 ...
- Leetcode 347.前K个高频元素 By Python
给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], ...
- leetcode.排序.347前k个高频元素-Java
1. 具体题目 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums ...
- leetcode 347. 前 K 个高频元素
问题描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums ...
- 347. 前K个高频元素
题目描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = ...
- 力扣347——前 K 个高频元素
这道题主要涉及的是对数据结构里哈希表.小顶堆的理解,优化时可以参考一些排序方法. 原题 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2, ...
随机推荐
- centos 部署的时候安装不上Mariadb,缺少依赖文件
并不存在这个sock文件 使用systemctl status mariadb.service 查看报错信息 提示libsystemd.so.0文件不存在, 安装systemd-libs包,解决问题, ...
- A*G#C001
AGC001 A BBQ Easy 贪心. https://agc001.contest.atcoder.jp/submissions/7856034 B Mysterious Light 很nb这个 ...
- 【转】Impala 中的 Invalidate Metadata 和 Refresh
前言Impala采用了比较奇葩的多个impalad同时提供服务的方式,并且它会由catalogd缓存全部元数据,再通过statestored完成每一次的元数据的更新到impalad节点上,Impala ...
- nginx rewrite实战实例
本部分内容为nginx生产环境中使用的场景示例. 域名跳转(域名重定向) 示例1(不带条件的): server{ listen ; server_name www.aminglinux.com; re ...
- 在Visual Studio中直接编译Fluent的UDF(修正)
原文见:http://blog.sina.com.cn/s/blog_14d64daa10102xkg4.html 主要是修正几个问题: 首先是头文件填入的顺序需要严格按照我前文给出的顺序填写,否则可 ...
- exception The absolute uri: [http://java.sun.com/jsp/jstl/core] cannot be resolved in either web.xml or the jar files deployed with this application
1.情景展示 eclipse,运行web项目时,报错信息如下: The absolute uri: [http://java.sun.com/jsp/jstl/core] cannot be ...
- jmeter(五十一)_性能测试中的服务器资源监控与分析
概述 性能测试过程中,对服务器资源的监控是必不可少的.这里的资源又分了两块,windows和linux linux下监控资源 访问网址http://jmeter-plugins.org/downl ...
- <每日 1 OJ> -LeetCode 21. 合并两个有序链表
题目: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4输出:1->1-> ...
- qt5 qmake开发
mkdir hello helloworld.cpp #include <QPushButton> #include <QApplication> int main(int a ...
- ES6 - 解构(数组和对象)
解构对象 /** * 解构:快捷,方便 * * 对象解构 */ { var expense = { type: "es6", amount: "45" }; / ...