一天一大 lee(前 K 个高频元素)难度:中等-Day20200907
时间:2022-07-25
本文章向大家介绍一天一大 lee(前 K 个高频元素)难度:中等-Day20200907,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例:
- 示例 1
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
- 示例 2
输入: nums = [1], k = 1
输出: [1]
抛砖引玉
抛砖引玉
思路
- 遍历记录每个元素出现的次数
- 对数组去重且按照出现的次数排序
- 前 k 个元素就要求的结果
/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
var topKFrequent = function (nums, k) {
let map = new Map(),
arr = []
for (let i = 0; i < nums.length; i++) {
if (map.has(nums[i])) {
let val = map.get(nums[i])
map.set(nums[i], ++val)
} else {
map.set(nums[i], 1)
arr.push(nums[i])
}
}
let sortArr = arr.sort((a, b) => map.get(b) - map.get(a))
return sortArr.splice(0, k)
}
堆
- 声明一个堆数组,存储k个不重复元素作为出现频率为前k的元素
- 堆数组内出现频率从小到大排列
- 第k个元素之后的元素,分别于堆数组的顶部(即第一个元素的)比较出现频率
- 大于则替换顶部元素,然后对堆重新排序(此时只涉及顶部元素安放到合适的位置)
- 小于等于则忽略
var topKFrequent = function (nums, k) {
let map = new Map(),
heap = [],
arr = []
for (let i = 0; i < nums.length; i++) {
if (map.has(nums[i])) {
let val = map.get(nums[i])
map.set(nums[i], ++val)
} else {
map.set(nums[i], 1)
arr.push(nums[i])
}
}
if (map.size <= k) return arr
for (let [key, value] of map) {
if (heap.length < k) {
heap.push(key)
// 堆内放够k个元素后,对前k个元素堆化(即根据出现频率从小到大排列)
buildHeapIn(heap.length - 1);
} else if (map.get(heap[0]) < value) {
// 出现大于堆顶的元素则替换掉对顶,并且重新对新的堆排序
heap[0] = key
buildHeapOut(0);
}
}
// 添加元素重新排序
function buildHeapIn(x) {
while (x > 0) {
let y = parseInt((x - 1)/2,10);
if (map.get(heap[y]) > map.get(heap[x])) {
swap(heap,y, x);
x = y;
} else {
break;
}
}
}
// 替换元素重新排序
function buildHeapOut(x) {
while (2 * x + 1 < heap.length) {
let y = 2 * x + 1;
if (y + 1 < heap.length && map.get(heap[y+1]) < map.get(heap[y])) {
y++;
}
if ( map.get(heap[x]) > map.get(heap[y])) {
swap(heap,x, y);
x = y;
} else {
break;
}
}
}
// 替换元素
function swap(arr, i, j) {
let temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
return heap.reverse()
}
桶排序
- 利用一遍哈希、一遍索引对出现次数排序
- 哈希:
- key:数组中的元素
- vlaue:元素出现的频率
- 索引:
- 索引:出现的频率
- value:出现的元素(注意因为有不同元素出现相同次数的情况,所以value为数组)
/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
var topKFrequent = (nums, k) => {
let map = new Map(),
heap = [],
arr = [],
_result = []
ValueKey = [];
// 哈希
for (let i = 0; i < nums.length; i++) {
if (map.has(nums[i])) {
let val = map.get(nums[i])
map.set(nums[i], ++val)
} else {
map.set(nums[i], 1)
arr.push(nums[i])
}
}
if (map.size <= k) return arr
// 索引
for (let [key, value] of map) {
if (!ValueKey[value]) {
ValueKey[value] = [key];
} else {
ValueKey[value].push(key)
}
}
// 从后向其取k个元素
for (let i = ValueKey.length - 1; i >= 0; i--) {
if (_result.length < k && ValueKey[i]) {
_result = _result.concat(ValueKey[i])
} else {
continue
}
}
return _result;
};
- Python中赋值、浅拷贝与深拷贝
- git 简易使用说明
- 开发篇-MySQL分区(一)
- Establishing SSL connection without server's identity verification is not recommended. According to
- Django-认证系统
- javascript:双链表-插入排序
- javascript:二叉搜索树 实现
- 自然语言处理 语言模型介绍
- 口水先擦干!从大数据看外卖如何拯救“忙”与“宅”
- javascript:巧用eval函数组装表单输入项为json对象
- Django——model基础
- java学习:日期的运算
- ORACLE:写Function时,传入参数变量名的注意事项
- spring boot 登录注册 demo (二) -- 数据库访问
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Kafka2.6.0发布——性能大幅提升
- BlackHat2020议题之Web缓存投毒
- 新版RTSP视频平台EasyNVR视频广场分页数据展示优化
- 自己动手编写一个Mybatis插件:mybatis脱敏插件
- 【每日一题】36. Valid Sudoku
- 【网易云课堂】Java语言程序设计进阶----第一周编程作业
- 11 Confluent_Kafka权威指南 第十一章:流计算
- 简直骚操作,ThreadLocal还能当缓存用
- 品优购(IDEA版)-第一天
- 品优购(IDEA版)-第二天
- 品优购第四天
- 深度学习框架OneFlow的并行特色(附框架源码和教程)
- 图解Java设计模式
- python 如何解决 No module named ‘pip‘问题
- 用多智能体强化学习算法MADDPG解决"老鹰捉小鸡"问题