秋招力扣Hot100刷题总结——堆

server/2024/12/22 14:23:11/

1. 数组中的第K个最大元素 leetcode.cn/problems/kth-largest-element-in-an-array/description/" rel="nofollow">题目链接

  • 题目要求:给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
    请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
    你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。
    在这里插入图片描述
  • 代码及思路
    • 使用小根堆来解决,遍历数组,将元素放入堆中
    • 当堆的大小大于k时,将堆顶元素弹出
    • 最终堆中元素是数组中最大的k个元素,且堆顶是其中最小的
    • 代码
class Solution {public int findKthLargest(int[] nums, int k) {PriorityQueue<Integer> minHeap = new PriorityQueue<>();for(int num :nums){minHeap.add(num);if(minHeap.size()>k){minHeap.poll();}}return minHeap.peek();}  
}

2. 寻找两个正序数组的中位数 leetcode.cn/problems/median-of-two-sorted-arrays/" rel="nofollow">题目链接

  • 题目要求:给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
    算法的时间复杂度应该为 O(log (m+n)) 。
    在这里插入图片描述
  • 代码及思路
    • 分别用一个大根堆和一个小跟堆存储来存储两个数组中较小的一半元素和较大的一半元素
    • 大根堆存储元素数量大于等于小跟堆,每次将元素入队后需要对大根堆和小跟堆的大小进行调整
    • 最终的中位数就是两个队堆顶元素之和的一半或者是大根堆堆顶元素
    • 代码
class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {PriorityQueue<Integer> minHeap=new PriorityQueue<>();PriorityQueue<Integer> maxHeap=new PriorityQueue<>((a,b)->b-a);for(int a:nums1){if(maxHeap.isEmpty()||a<maxHeap.peek()){maxHeap.offer(a);}else{minHeap.offer(a);}balance(maxHeap,minHeap);}for(int b:nums2){if(maxHeap.isEmpty()||b<maxHeap.peek()){maxHeap.offer(b);}else{minHeap.offer(b);}balanc(maxHeap,minHeap);}if(maxHeap.size()==minHeap.size())return (maxHeap.peek()+minHeap.peek())/2.0;return maxHeap.peek()/1.0;}private void balanc(PriorityQueue<Integer> maxHeap,PriorityQueue<Integer> minHeap){if(maxHeap.size()>minHeap.size()+1){minHeap.offer(maxHeap.poll());}else if(minHeap.size()>maxHeap.size()){maxHeap.offer(minHeap.poll());}}
}

3. 前 K 个高频元素 leetcode.cn/problems/top-k-frequent-elements/description/" rel="nofollow">题目链接

  • 题目要求:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
    在这里插入图片描述
  • 代码及思路
    • 使用hash和堆排序解决问题
    • 首先遍历数组统计每个元素出现的次数,然后根据每个元素的个数将其存储到一个大根堆中
    • 取出堆中的前k个元素,即为答案
    • 代码
class Solution {public int[] topKFrequent(int[] nums, int k) {Map<Integer,Integer> cache=new HashMap<>();for(int num:nums){cache.put(num,cache.getOrDefault(num,0)+1);}PriorityQueue<Integer> que=new PriorityQueue<>((a,b)->cache.get(b)-cache.get(a));for(int key:cache.keySet()){que.offer(key);}int[] res=new int[k];for(int i=0;i<k;i++){res[i]=que.poll();}return res;}
}

http://www.ppmy.cn/server/107879.html

相关文章

WEB应用服务器 -- Tomcat详解及案例实现

一、Web前端三大核心技术 1.1 HTML HTML&#xff08;HyperText Markup Language&#xff09;超文本标记语言&#xff0c;它不同于一般的编程语言。超文本即超出纯文本的范畴&#xff0c;例如&#xff1a;描述文本颜色、大小、字体等信息&#xff0c;或使用图片、音频、视频等…

Django后台管理Xadmin使用DjangoUeditor富文本编辑器

Django后台管理Xadmin使用DjangoUeditor富文本编辑器 一、下载 点击github下载 https://github.com/twz915/DjangoUeditor3 1、下载完后解压到跟xadmin同一层级目录: 2、解压后名称可能为DjangoUeditor3-master,需要改为DjangoUeditor 3、进入DjangoUeditor目录,把Djan…

C/C++ 编译过程概述

C/C的编译过程可以分为四个主要阶段&#xff1a;预处理、编译、汇编和链接 1. 预处理&#xff08;Preprocessing&#xff09; 预处理阶段由预处理器完成&#xff0c;主要是对源代码文件进行一些替换操作&#xff0c;常见的预处理任务包括&#xff1a; 宏替换&#xff1a;展开…

Python---字符串对象和切片操作

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 一.字符串内置函数 大小写函数 upper()函数&#xff1a;将字符串中的所有小写字母转换为大写字母。isupper()&#xff1a;判断是否大写 s "hello world" print(s.upper()) …

PHP安装扩展包时忽略依赖强制安装

正常安装时会检查依赖包&#xff0c;比如是否安装了reids扩展&#xff0c;是否安装了gd库等&#xff0c;卖到依赖包安装失败。 如下提示&#xff1a; 这样会导致你的包安装不上。 使用下面命令&#xff0c;强制安装&#xff0c;如下&#xff1a; 加上 --ignore-platform-req…

日常刷题(24)

1. 拼接最大数 1.1. 题目描述 给你两个整数数组 nums1 和 nums2&#xff0c;它们的长度分别为 m 和 n。数组 nums1 和 nums2 分别代表两个数各位上的数字。同时你也会得到一个整数 k。 请你利用这两个数组中的数字中创建一个长度为 k < m n 的最大数&#xff0c;在这个必…

排序------快速排序(C语言实现)

目录 快速排序算法 例题 题目描述 具体代码&#xff1a; 代码分析 函数定义&#xff1a; 主函数&#xff1a; 快速排序算法 快速排序&#xff08;QuickSort&#xff09;是一种高效的排序算法&#xff0c;它采用分治策略&#xff0c;通过选择一个“基准”元素并将其他元素…

Vue学习--- vue3 集成遇到的部分问题与解决

构建异常 1. 问题&#xff1a;ESLint: Do not access Object.prototype method hasOwnProperty from target o 报错解释&#xff1a; ESLint 报错信息 "Do not access Object.prototype method hasOwnProperty from target object" 指的是不应该从目标对象访问 Ob…