堆【Lecode_HOT100】

文章目录

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

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

在这里插入图片描述

  • 方法一:NlogN不能满足时间复杂度的要求
 public int findKthLargest(int[] nums, int k) {Arrays.sort(nums);return nums[nums.length-k];}
  • 方法二:快速排序 NlogN 不能满足时间复杂度的要求
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);}
  • 方法三:
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
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

在这里插入图片描述

  • 桶排序
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.rhkb.cn/news/493525.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 搭建AIDL Client和Server端,双向通信

一、背景 使用AIDL,搭建Client和Server端,实现跨进程通讯,即两个应用之间可以相互通讯。这里列举AIDL实现的方式和需注意的细节&#xff0c;并附上源码。 二、实现方式 2.1 定义AIDL需要的接口,名字为xxx.aidl,Client和Server端 AIDL接口的包名和aidl文件必须一致&#xff0c…

HIPT论文阅读

题目《Scaling Vision Transformers to Gigapixel Images via Hierarchical Self-Supervised Learning》 论文地址&#xff1a;[2206.02647] Scaling Vision Transformers to Gigapixel Images via Hierarchical Self-Supervised Learning 项目地址&#xff1a;mahmoodlab/HI…

[ESP]从零开始的Arduino IDE安装与ESP环境配置教程

一、前言 最近也是在比赛方面比较忙&#xff0c;没有更多的时间和精力去更新长文章了。这几周都更倾向于环境搭建的教程&#xff0c;这类教程写起来确实方便&#xff0c;也不怎么费时间&#xff0c;一个下午基本可以搞定&#xff0c;哈哈&#xff0c;我保证不是在为自己想摆烂找…

投标心态:如何在“标海战术”中保持清醒的头脑?

在竞争激烈的市场环境下&#xff0c;“标海战术”——即大规模参与投标——已经成为许多企业争取市场份额的重要策略。然而&#xff0c;盲目追求投标数量可能导致资源浪费、团队疲劳以及战略目标的模糊化。在这种高强度的竞争模式中&#xff0c;如何保持清醒的头脑&#xff0c;…

wxWidgets使用wxStyledTextCtrl(Scintilla编辑器)的正确姿势

开发CuteMySQL/CuteSqlite开源客户端的时候&#xff0c;需要使用Scintilla编辑器&#xff0c;来高亮显示SQL语句&#xff0c;作为C/C领域最成熟稳定又小巧的开源编辑器&#xff0c;Scintilla提供了强大的功能&#xff0c;wxWidgets对Scintilla进行包装后的是控件类&#xff1a;…

【原生js案例】让你的移动页面实现自定义的上拉加载和下拉刷新

目前很多前端UI都是自带有上拉加载和下拉刷新功能,按照官网配置去实现即可,比如原生小程序,vantUI等UI框架,都替我们实现了内部功能。 那如何自己来实现一个上拉加载和下拉刷新的功能? 实现效果 不用浏览器的css滚动条,自定义实现滚动效果 自定义实现滚动,添加上拉加载…

批处理理解

初识批处理 如何批处理&#xff1a; 命名&#xff1a;.bat 方法&#xff1a;创建一个记事本文件&#xff0c;然后将其扩展改为.bat 批处理作用&#xff1a;自上而下成批处理每一条DOS命令&#xff0c;直到执行到最后一条。运行环境&#xff1a;当然是我们cmd了 回归我学过的…

APM32F411使用IIS外设驱动es8388实现自录自播

前言&#xff1a; 从零开始学习I2s外设&#xff0c;配置Es8288寄存器实现录音播放。本文章使用主控芯片是APM32F411系类。音频相关的概念比较多&#xff0c;就不再次做过多的介绍&#xff0c;本文章只是简单实现边录边播功能。APM系类兼容st的芯片&#xff0c;所以用st的hal库来…

OB删除1.5亿数据耗费2小时

目录 回顾&#xff1a;mysql是怎么删除数据的&#xff1f; 删除方案 代码实现 执行结果 结论 本篇是实际操作 批量处理数据以及线程池线程数设置 记录学习 背景&#xff1a;有一张用户标签表&#xff0c;存储数据量达4个亿&#xff0c;使用OceanBase存储&#xff0c;由于…

20241217使用M6000显卡在WIN10下跑whisper来识别中英文字幕

20241217使用M6000显卡在WIN10下跑whisper来识别中英文字幕 2024/12/17 17:21 缘起&#xff0c;最近需要识别法国电影《地下铁》的法语字幕&#xff0c;使用 字幕小工具V1.2【whisper套壳/GUI封装了】 无效。 那就是直接使用最原始的whisper来干了。 当你重装WIN10的时候&#…

linux普通用户使用sudo不需要输密码

1.root用户如果没有密码&#xff0c;先给root用户设置密码 sudo passwd root #设置密码 2.修改visudo配置 su #切换到root用户下 sudo visudo #修改visudo配置文件 用户名 ALL(ALL) NOPASSWD: ALL #下图所示处新增一行配置 用户名需要输入自己当前主机的用户名

【C++11】可变模板参数

目录 可变模板的定义方式 参数包的展开方式 递归的方式展开参数包 STL中的emplace相关接口函数 STL容器中emplace相关插入接口函数 ​编辑 模拟实现&#xff1a;emplace接口 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板&#xff0c;相比 C9…

python 曲线拟合,曲线拟合交点

目录 效果图: 源代码: 效果图: 源代码: import json import os import shutilimport cv2 import numpy as npfrom numpy.polynomial.polynomial import Polynomialdef calculate_distance(x1, y1, x2, y2):return np.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)def get_new_g…

Java模拟Mqtt客户端连接Mqtt Broker

Java模拟Mqtt客户端基本流程 引入Paho MQTT客户端库 <dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.mqttv5.client</artifactId><version>1.2.5</version> </dependency>设置mqtt配置数据 …

圣诞快乐(h5 css js(圣诞树))

一&#xff0c;整体设计思路 圣诞树h5&#xff08;简易&#xff09; 1.页面布局与样式&#xff1a; 页面使用了全屏的黑色背景&#xff0c;中央显示圣诞树&#xff0c;树形由三层绿色的三角形组成&#xff0c;每一层的大小逐渐变小。树干是一个棕色的矩形&#xff0c;位于三角…

多音轨视频使用FFmpeg删除不要音轨方法

近期给孩子找宫崎骏动画&#xff0c;但是有很多是多音轨视频但是默认的都是日语&#xff0c;电视上看没办法所以只能下载后删除音轨文件只保留中文。 方法分两步&#xff0c;先安装FFmpeg在转文件即可。 第一步FFmpeg安装 FFmpeg是一个开源项目&#xff0c;包含了处理视频的…

时空信息平台架构搭建:基于netty封装TCP通讯模块(IdleStateHandler网络连接监测,处理假死)

文章目录 引言I 异步TCP连接操作II 心跳机制:空闲检测(读空闲和写空闲)基于Netty的IdleStateHandler类实现心跳机制(网络连接监测)常规的处理假死健壮性的处理假死方案引言 基于netty实现TCP客户端:封装断线重连、连接保持 https://blog.csdn.net/z929118967/article/de…

中国新能源汽车公共充电桩数据合集(2002-2023年)

数据来源&#xff1a;全国各省市统计年鉴、统计公报、国家能源署、中国汽车行业协会&#xff0c;各类汽车统计年鉴、中国电动汽车充电基础设施促进联盟等 时间跨度&#xff1a;新能源汽车数据集&#xff1a;2002-2023年&#xff08;不同数据时间跨度有差异&#xff0c;详见数据…

设计模式12:状态模式

系列总链接&#xff1a;《大话设计模式》学习记录_net 大话设计-CSDN博客 参考&#xff1a;设计模式之状态模式 (C 实现)_设计模式的状态模式实现-CSDN博客 1.概述 状态模式允许一个对象在其内部状态改变时改变其行为。对象看起来像是改变了其类。使用状态模式可以将状态的相…

国内网络在Ubuntu 22.04中在线安装Ollama并配置Open-WebuiDify

配置docker科技网络 登录后复制 创建或编辑 Docker 配置文件 让docker使用代理&#xff1a; sudo mkdir /etc/systemd/system/docker.service.d -p sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf 文件&#xff0c;并添加以下内容&#xff1a; [Service] En…