【学习打卡】第25天 数据结构和算法
2022/8/31 4:22:47
本文主要是介绍【学习打卡】第25天 数据结构和算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前 K 个高频元素(leetcode - 347)
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 输入: nums = [1], k = 1 输出: [1]
思路一(排序)
- 创建一个map来表示nums的数据以及出现次数的映射关系
- 将map转换为数组进行排序
- 最终得出
/** * @param {number[]} nums * @param {number} k * @return {number[]} */ var topKFrequent = function(nums, k) { const map = new Map(); nums.forEach( n => { map.set(n, map.has(n) ? map.get(n) + 1 : 1) }); const arr = Array.from(map).sort((a,b)=> b[1] - a[1]).slice(0, k); return arr.map(n => n[0]) };
复杂度分析:
时间复杂度:O(nlogn)
空间复杂度: O(n)
思路二(堆)
- 创建一个map来表示nums的数据以及出现次数的映射关系
- 创建一个长度为k的最小堆
- 遍历数据结束后,堆再经过处理后返回
class MinHeap { constructor() { this.heap = []; } swap(i1, i2) { const temp = this.heap[i1]; this.heap[i1] = this.heap[i2]; this.heap[i2] = temp; } getParentIndex(index) { return Math.floor((index - 1) / 2); } getLeftIndex(index) { return index * 2 + 1; } getRightIndex(index) { return index * 2 + 2; } shiftUp(index) { if (index === 0) return const parentIndex = this.getParentIndex(index); if (this.heap[parentIndex] && this.heap[parentIndex].value > this.heap[index].value) { this.swap(index, parentIndex); this.shiftUp(parentIndex) } } shiftDown(index) { if (index === this.heap.length - 1) return; const leftIndex = this.getLeftIndex(index); const rightIndex = this.getRightIndex(index); if (this.heap[leftIndex] && this.heap[leftIndex].value < this.heap[index].value) { this.swap(index, leftIndex); this.shiftDown(leftIndex); } if (this.heap[rightIndex] && this.heap[rightIndex].value < this.heap[index].value) { this.swap(index, rightIndex); this.shiftDown(rightIndex); } } insert(val) { this.heap.push(val); this.shiftUp(this.heap.length - 1); } pop() { this.heap[0] = this.heap.pop(); this.shiftDown(0); } peek() { return this.heap[0]; } size() { return this.heap.length; } } var topKFrequent = function(nums, k) { const map = new Map(); nums.forEach( n => { map.set(n, map.has(n) ? map.get(n) + 1 : 1) }); const h = new MinHeap(); for(let [key, value] of map) { h.insert({key, value}) if(h.size() > k) { h.pop(); } } return h.heap.map(n => n.key) };
复杂度分析:
时间复杂度:O(nlogk)
空间复杂度: O(n)
这篇关于【学习打卡】第25天 数据结构和算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-24Java中定时任务实现方式及源码剖析
- 2024-11-24Java中定时任务实现方式及源码剖析
- 2024-11-24鸿蒙原生开发手记:03-元服务开发全流程(开发元服务,只需要看这一篇文章)
- 2024-11-24细说敏捷:敏捷四会之每日站会
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解