堆【Lecode_HOT100】

embedded/2024/12/22 14:24:52/

文章目录

        • 1.数组中的第K个最大元素No.215
        • 2.前K个高频元素347

1.数组中的第K个最大元素No.215

在这里插入图片描述

  • 方法一:NlogN不能满足时间复杂度的要求
java"> public int findKthLargest(int[] nums, int k) {Arrays.sort(nums);return nums[nums.length-k];}
  • 方法二:快速排序 NlogN 不能满足时间复杂度的要求
java">public int findKthLargest(int[] nums, int k) {quick_sort(nums,0,nums.length-1);return nums[nums.length-k];}public void quick_sort(int[] nums,int l,int r){if(l>=r) return;int i = l-1;int j = r+1;int x = nums[l];while(i<j){do{i++;}while(nums[i]<x);do{j--;}while(nums[j]>x);if(i<j){int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}quick_sort(nums,l,j);quick_sort(nums,j+1,r);}
  • 方法三:
java">class Solution {// 主函数,用于找到数组中第k大的元素public int findKthLargest(int[] nums, int k) {int n = nums.length;  // 获取数组长度return quick(nums, 0, n - 1, n - k);  // 调用快速选择算法,寻找第(n-k+1)小的元素,即第k大的元素}// 快速选择算法实现int quick(int[] a, int left, int right, int index) {int p = partition(a, left, right);  // 对数组进行划分,并返回枢轴位置if (p == index) {  // 如果枢轴位置正好是目标索引return a[p];  // 返回该位置的元素值}if (p < index) {  // 如果目标索引在枢轴右侧return quick(a, p + 1, right, index);  // 在右子区间继续查找} else {  // 如果目标索引在枢轴左侧return quick(a, left, p - 1, index);  // 在左子区间继续查找}}// 划分函数,使用随机选择的枢轴进行划分int partition(int[] a, int left, int right) {int idx = ThreadLocalRandom.current().nextInt(right - left + 1) + left;  // 随机选择一个枢轴位置swap(a, left, idx);  // 将枢轴放到最左边int pv = a[left];  // 取出枢轴值int i = left + 1;  // 初始化左侧指针int j = right;  // 初始化右侧指针while (i <= j) {  // 当左右指针未交错时while (i <= j && a[i] < pv) {  // 左侧找比枢轴大的i++;}while (i <= j && a[j] > pv) {  // 右侧找比枢轴小的j--;}if (i <= j) {  // 如果找到了一对可以交换的元素swap(a, i, j);  // 交换这对元素i++;  // 移动左侧指针j--;  // 移动右侧指针}}swap(a, j, left);  // 将枢轴放回正确的位置return j;  // 返回枢轴的新位置}// 交换数组中的两个元素void swap(int[] a, int i, int j) {int t = a[i];  // 暂存一个元素a[i] = a[j];  // 交换操作a[j] = t;}
}
  • I like
java">import java.util.Random;class Solution {public int findKthLargest(int[] nums, int k) {int n = nums.length;int target = n - k;  // 因为要找第 k 大元素,等价于找第 n-k 小元素int l = 0, r = n - 1;while (l <= r) {int pIndex = partition(nums, l, r);  // 划分后的枢轴位置if (pIndex == target) {return nums[pIndex];  // 找到目标元素} else if (pIndex < target) {l = pIndex + 1;  // 目标元素在右半部分} else {r = pIndex - 1;  // 目标元素在左半部分}}return -1;  // 理论上应该不会到这里,保证数组一定有效}public int partition(int[] nums, int l, int r) {Random random = new Random();int idx = random.nextInt(r - l + 1) + l;  // 随机选择枢轴swap(nums, l, idx);  // 将枢轴放到数组的最左边int x = nums[l];  // 取出枢轴值int i = l + 1;  // 左侧指针int j = r;      // 右侧指针while (i <= j) {while (i <= j && nums[i] < x) {  // 左侧找比枢轴大的i++;}while (i <= j && nums[j] > x) {  // 右侧找比枢轴小的j--;}if (i <= j) {swap(nums, i, j);  // 交换不符合条件的元素i++;j--;}}swap(nums, l, j);  // 将枢轴放到正确位置return j;  // 返回枢轴的位置}// 交换数组中的两个元素public void swap(int[] nums, int x, int y) {int temp = nums[x];nums[x] = nums[y];nums[y] = temp;}
}
2.前K个高频元素347

在这里插入图片描述

  • 桶排序
java">class Solution {public int[] topKFrequent(int[] nums, int k) {// 创建一个hashmap,并统计每个元素的频率HashMap<Integer, Integer> map = new HashMap<>();for (int num : nums) {map.put(num, map.getOrDefault(num, 0) + 1);}// 创建桶数组,桶的索引表示元素的频率,桶中的元素是具有相同频率的数字List<Integer>[] bucket = new List[nums.length + 1];for (int i = 0; i < bucket.length; i++) {bucket[i] = new ArrayList<>();}// 将频率存入桶中for (Map.Entry<Integer, Integer> entry : map.entrySet()) {bucket[entry.getValue()].add(entry.getKey());}// 从桶中提取前 k 个频率最高的元素int[] res = new int[k];int index = 0;for (int i = bucket.length - 1; i >= 0 && index < k; i--) {for (int num : bucket[i]) {res[index++] = num;if (index == k) {break; // 找到 k 个元素后退出}}}return res;}
}

http://www.ppmy.cn/embedded/147847.html

相关文章

DePIN潜力项目Spheron解读:激活闲置硬件,赋能Web3与AI

DePIN赛道作为今年加密资本关注的热点之一&#xff0c;不仅吸引了大量资金涌入&#xff0c;还凭借其灵活的资源调配、高效的运作方式和可靠的安全性能&#xff0c;逐渐渗透到多个领域和项目中。例如&#xff0c;Helium的无线网络协议、IoTeX的去中心化物联网、IO NET的去中心化…

线程和进程、作业的区别

线程和进程、作业的区别 作业&#xff08;任务&#xff09;有多个进程&#xff0c;进程有多个线程 进程&#xff08;Process&#xff09;&#xff1a; 进程是程序的一次执行过程&#xff0c;是操作系统进行资源分配和调度的基本单位。 每个进程都有独立的内存空间&#xff0c…

编辑, 抽成组件

问题 错误思路&#xff1a; 1 dept不能修改&#xff0c; 用watch监听一下&#xff1a;赋值给新的变量进行修改&#xff0c; 问题&#xff1a; currentDept 发生改变&#xff0c; depth也发生了改变&#xff0c;因为是浅拷贝&#xff0c; 用了json.pase(json.stringify(value…

弹性裸金属服务器(神龙):助力企业腾飞的云计算“黑科技”

在云计算飞速发展的今天&#xff0c;企业对于计算资源的需求早已不再满足于简单的“够用”&#xff0c;而是追求极致的性能、灵活的伸缩和数据安全的保障。那么&#xff0c;问题来了&#xff1a;如何在性能与弹性之间取得完美的平衡&#xff1f; 答案就是——阿里云弹性裸金属…

Oracle/MySQL 到 OceanBase 数据库迁移的关键问题与解决方案

目录 一. 什么是 OceanBase 数据库&#xff1f; 二. OceanBase 数据库的应用场景 三. Oracle 数据迁移到 OceanBase 的经典案例 四. MySQL 数据迁移到 OceanBase 的经典案例 五. OceanBase 的优势与挑战 六. 迁移中的重点问题及解决方案 七. 总结 OceanBase 数据库技术分…

3D Gaussian Splatting for Real-Time Radiance Field Rendering-简洁版

1. 研究背景与问题 传统的3D场景表示方法&#xff0c;如网格和点云&#xff0c;适合GPU加速的光栅化操作&#xff0c;但缺乏灵活性。而基于神经辐射场&#xff08;NeRF&#xff09;的表示方式&#xff0c;尽管质量高&#xff0c;但需要高成本的训练和渲染时间。此外&#xff0…

基于Spring Boot的阿坝州旅游系统

一、系统背景与目的 随着旅游业的快速发展和互联网技术的不断进步&#xff0c;越来越多的游客开始通过网络平台来查询旅游信息、预订旅游产品。为了满足游客对阿坝州旅游信息的需求&#xff0c;提升阿坝州旅游业的整体服务水平&#xff0c;基于Spring Boot技术框架开发了一款阿…

springboot接入ftp/ftps并上传文件和配置

springboot接入ftp/ftps并上传文件和配置 1. 整体描述2. 具体实现2.1 引入pom2.2 创建ftps连接2.3 上传文件2.4 关闭连接2.5 创建FTP目录2.6 main方法2.7 运行结果 3. FTP服务器配置3.1 修改require_ssl_reuse参数3.2 设置FTPS连接3.3 设置FTPS连接为隐式连接 4. 总结 1. 整体描…