春招冲刺百题计划|堆

Java基础复习

  1. Java数组的声明与初始化
  2. Java ArrayList
  3. Java HashMap
  4. Java String 类
  5. Java LinkedList
  6. Java Deque继承LinkedList
  7. Java Set
  8. Java 队列
  9. 优先队列:第二题用到了

第一题:215. 数组中的第K个最大元素

在这里插入图片描述
可以直接使用Arrays.sort()快排,然后return nums[n-k];
或者手动实现快速选择的内容:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
在这里插入图片描述

class Solution {int quickselect(int[] nums, int l, int r, int k) {if (l == r) return nums[k];int x = nums[l], i = l - 1, j = r + 1; //选最左边的为基准。while (i < j) {do{ i++; }while(nums[i] < x);//左边的都小于xdo{j--;}while(nums[j] > x);//右边的都大于xif (i < j){int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}}if (k <= j) return quickselect(nums, l, j, k); //一趟排序后,基准比第k大的大,那么在基准左边找。else return quickselect(nums, j + 1, r, k);//否则在基准右边找。}public int findKthLargest(int[] _nums, int k) {int n = _nums.length;return quickselect(_nums, 0, n - 1, n - k);}
}

另一种解法就是堆排序:参考:https://pdai.tech/md/algorithm/alg-sort-x-heap.html
逻辑结构是完全二叉树,存储结构是数组。之间的联系如下:
在这里插入图片描述算法实现步骤就是, ① 初始化堆: 将数列a[1…n]构造成最大堆。 ② 交换数据: 将a[1]和a[n]交换,使a[n]是a[1…n]中的最大值;然后将a[1…n-1]重新调整为最大堆。 接着,将a[1]和a[n-1]交换,使a[n-1]是a[1…n-1]中的最大值;然后将a[1…n-2]重新调整为最大值。 依次类推,直到整个数列都是有序的。

    public static void maxHeapDown(int[] a, int start, int end) {int c = start;            // 当前(current)节点的位置int l = 2*c + 1;        // 左(left)孩子的位置int tmp = a[c];            // 当前(current)节点的大小for (; l <= end; c=l,l=2*l+1) {// "l"是左孩子,"l+1"是右孩子if ( l < end && a[l] < a[l+1])l++;        // 左右两孩子中选择较大者,即m_heap[l+1]if (tmp >= a[l])break;        // 调整结束else {            // 交换值a[c] = a[l];a[l]= tmp;}}}/** 堆排序(从小到大)** 参数说明: *     a -- 待排序的数组*     n -- 数组的长度*/public static void heapSortAsc(int[] a, int n) {int i,tmp;// 从(n/2-1) --> 0逐次遍历。遍历之后,得到的数组实际上是一个(最大)二叉堆。for (i = n / 2 - 1; i >= 0; i--)maxHeapDown(a, i, n-1);// 从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素for (i = n - 1; i > 0; i--) {// 交换a[0]和a[i]。交换后,a[i]是a[0...i]中最大的。tmp = a[0];a[0] = a[i];a[i] = tmp;// 调整a[0...i-1],使得a[0...i-1]仍然是一个最大堆。// 即,保证a[i-1]是a[0...i-1]中的最大值。maxHeapDown(a, 0, i-1);}}

提交代码:

class Solution {public static void heapSortAsc(int[] a, int n){for(int i=n/2-1; i>=0; i--){maxHeapDown(a, i, n-1);}for (int i = n - 1; i > 0; i--) {// 交换a[0]和a[i]。交换后,a[i]是a[0...i]中最大的。int tmp = a[0];a[0] = a[i];a[i] = tmp;// 调整a[0...i-1],使得a[0...i-1]仍然是一个最大堆。// 即,保证a[i-1]是a[0...i-1]中的最大值。maxHeapDown(a, 0, i-1);}}public static void maxHeapDown(int[] a, int start, int end) {int c = start;            // 当前(current)节点的位置int l = 2*c + 1;        // 左(left)孩子的位置int tmp = a[c];            // 当前(current)节点的大小for (; l <= end; c=l,l=2*l+1) {// "l"是左孩子,"l+1"是右孩子if ( l < end && a[l] < a[l+1])l++;        // 左右两孩子中选择较大者,即m_heap[l+1]if (tmp >= a[l])break;        // 调整结束else {            // 交换值a[c] = a[l];a[l]= tmp;}}}public int findKthLargest(int[] _nums, int k) {int n = _nums.length;heapSortAsc(_nums, n);return _nums[n-k];}
}

第二题:373. 查找和最小的 K 对数字

在这里插入图片描述
以下写法超出内存限制:

class Solution {public static void heapSortAsc(int[][] a, int n){for(int i=n/2-1; i>=0; i--){maxHeapDown(a, i, n-1);}for (int i = n - 1; i > 0; i--) {// 交换a[0]和a[i]。交换后,a[i]是a[0...i]中最大的。int[] tmp = a[0];a[0] = a[i];a[i] = tmp;// 调整a[0...i-1],使得a[0...i-1]仍然是一个最大堆。// 即,保证a[i-1]是a[0...i-1]中的最大值。maxHeapDown(a, 0, i-1);}}public static void maxHeapDown(int[][] a, int start, int end) {int c = start;            // 当前(current)节点的位置int l = 2*c + 1;        // 左(left)孩子的位置int[] tmp = a[c];            // 当前(current)节点的大小for (; l <= end; c=l,l=2*l+1) {// "l"是左孩子,"l+1"是右孩子if ( l < end && (a[l][0] + a[l][1]) < (a[l+1][0] + a[l+1][1]))l++;        // 左右两孩子中选择较大者,即m_heap[l+1]if ((tmp[0]+tmp[1]) >=  (a[l][0] + a[l][1]))break;        // 调整结束else {            // 交换值a[c] = a[l];a[l] = tmp;}}}public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {int n = nums1.length*nums2.length;int[][] a = new int[n][2];int idx = 0;for(int i=0; i<nums1.length; i++){for(int j=0; j<nums2.length; j++){a[idx][0] = nums1[i];a[idx++][1] = nums2[j];}}heapSortAsc(a, n);List<List<Integer>> results = new ArrayList<List<Integer>>();   for(int i=0; i<k; i++){List<Integer> tmp = new ArrayList<Integer>();tmp.add(a[i][0]);tmp.add(a[i][1]);results.add(tmp);}return results;}
}

参考:灵茶山艾府的题解
在这里插入图片描述
觉得这样的大神,每次写得代码都很简洁。哭唧唧。我和这篇的问题,就在于,我使用的代码的堆,没办法随时调整。

class Solution {public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {List<List<Integer>> ans = new ArrayList<>(k); // 预分配空间PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> a[0] - b[0]);pq.add(new int[]{nums1[0] + nums2[0], 0, 0});while (ans.size() < k) {int[] p = pq.poll();int i = p[1];int j = p[2];ans.add(List.of(nums1[i], nums2[j]));if (j == 0 && i + 1 < nums1.length) {pq.add(new int[]{nums1[i + 1] + nums2[0], i + 1, 0});}if (j + 1 < nums2.length) {pq.add(new int[]{nums1[i] + nums2[j + 1], i, j + 1});}}return ans;}
}

这里自己仿照源码写了一份优先队列

class Solution {class MyPriorityQueue{//仿照源码编写自己的private int[][] queue;private int size;MyPriorityQueue(){queue=new int[0][0];size = 0;}private int Mycompare(int[] a, int[] b){return a[0]-b[0];}public void offer(int[] e){int i = size;if (i >= queue.length)queue = Arrays.copyOf(queue, i+1);size = i + 1;if (i == 0)//队列原来为空,这是插入的第一个元素queue[0] = e;elsesiftUp(i, e);//调整}private void siftUp(int k, int[] x) { //找到x该待的位置while (k > 0) {int parent = (k - 1) >>> 1;//parentNo = (nodeNo-1)/2int[] e = queue[parent];if (Mycompare(x, e) >= 0) break;queue[k] = e;k = parent;}queue[k] = x;}public int[] peek() {if (size == 0)return null;return queue[0];//0下标处的那个元素就是最小的那个}public int[] poll() {if (size == 0)return null;int s = --size;int[] result = queue[0];//0下标处的那个元素就是最小的那个int[] x = queue[s]; //最后一个叶子结点queue[s] = null;if (s != 0) //队列不为空要调整siftDown(0, x);//调整return result;}private void siftDown(int k, int[] x) {int half = size >>> 1; //size/2while (k < half) {//首先找到左右孩子中较小的那个,记录到c里,并用child记录其下标int child = (k << 1) + 1;//leftNo = parentNo*2+1int[] c = queue[child];int right = child + 1;if (right < size && Mycompare(c, queue[right]) > 0)c = queue[child = right];if (Mycompare(x, c) <= 0)break;queue[k] = c;//然后用c取代原来的值k = child;}queue[k] = x;}}public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {List<List<Integer>> ans = new ArrayList<>(k); // 预分配空间MyPriorityQueue pq = new MyPriorityQueue();pq.offer(new int[]{nums1[0] + nums2[0], 0, 0});while (ans.size() < k) {int[] p = pq.poll();int i = p[1];int j = p[2];ans.add(List.of(nums1[i], nums2[j]));if (j == 0 && i + 1 < nums1.length) {pq.offer(new int[]{nums1[i + 1] + nums2[0], i + 1, 0});}if (j + 1 < nums2.length) {pq.offer(new int[]{nums1[i] + nums2[j + 1], i, j + 1});}}return ans;}
}

第三题:264. 丑数 II

在这里插入图片描述
首先明确一下质因子是什么?
质因子(或质因数)在数论里是指能整除给定正整数的质数。
只有两个正因数(1和它本身)的自然数即为质数。(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97…)
仔细想想还是不难的,就是用小顶堆,弹出一个x,添加2x,3x,5x进去。

class Solution {int[] NUMS = new int[]{2, 3, 5};class MyPriorityQueue{//仿照源码编写自己的private long[] queue;private int size;MyPriorityQueue(){queue=new long[0];size = 0;}private long Mycompare(long a, long b){return a-b;}public void offer(long e){int i = size;if (i >= queue.length)queue = Arrays.copyOf(queue, i+1);size = i + 1;if (i == 0)//队列原来为空,这是插入的第一个元素queue[0] = e;elsesiftUp(i, e);//调整}private void siftUp(int k, long x) { //找到x该待的位置while (k > 0) {int parent = (k - 1) >>> 1;//parentNo = (nodeNo-1)/2long e = queue[parent];if (Mycompare(x, e) >= 0) break;queue[k] = e;k = parent;}queue[k] = x;}public long peek() {return queue[0];//0下标处的那个元素就是最小的那个}public long poll() {int s = --size;long result = queue[0];//0下标处的那个元素就是最小的那个long x = queue[s]; //最后一个叶子结点queue[s] = -1;if (s != 0) //队列不为空要调整siftDown(0, x);//调整return result;}private void siftDown(int k, long x) {int half = size >>> 1; //size/2while (k < half) {//首先找到左右孩子中较小的那个,记录到c里,并用child记录其下标int child = (k << 1) + 1;//leftNo = parentNo*2+1long c = queue[child];int right = child + 1;if (right < size && Mycompare(c, queue[right]) > 0)c = queue[child = right];if (Mycompare(x, c) <= 0)break;queue[k] = c;//然后用c取代原来的值k = child;}queue[k] = x;}}public int nthUglyNumber(int n) {//我目前的思路就是得到一组序列,长度为n,就是从1开始算,找到第n个满足条件的就行。int[] result = new int[n+1];result[1] = 1;if(n==1){return result[n];}int sum=2;MyPriorityQueue queue = new MyPriorityQueue();Set<Long> had = new HashSet<>();queue.offer(2); had.add(2l);queue.offer(3); had.add(3l);queue.offer(5); had.add(5l);while(sum<=n){long tmp = queue.poll();result[sum] = (int)tmp;for(int i=0; i<NUMS.length; i++){if(!had.contains(tmp*NUMS[i])){had.add(tmp*NUMS[i]);queue.offer(tmp*NUMS[i]);}}sum++;}return result[n];}
}

第四题:218.天际线问题

在这里插入图片描述
算术评级是9,我就看一看,凑个热闹。
莫名想接雨水,但是接雨水好像是维护一个单调队列。
后期有时间再补。先把简单题和中等题搞明白。o(╥﹏╥)o。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/376114.html

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

相关文章

Let‘s Encrypt免费安全证书的步骤及使用

网站安全现已成为每个在线业务的重要考虑因素。为了确保网站与用户之间的通信安全&#xff0c;SSL/TLS证书发挥着至关重要的作用。 申请Lets Encrypt域名SSL证书步骤 1、登录来此加密网站&#xff0c;输入域名&#xff0c;可以勾选泛域名和包含根域。 2、选择加密方式&#x…

初识Laravel(Laravel的项目搭建)

初识Laravel&#xff08;Laravel的项目搭建&#xff09; 一、项目简单搭建&#xff08;laravel&#xff09;1.首先我们确保使用国内的 Composer 加速镜像&#xff08;[加速原理](https://learnku.com/php/wikis/30594)&#xff09;&#xff1a;2.新建一个名为 Laravel 的项目&a…

Java中创建线程的方式

文章目录 创建线程ThreadRunnableCallable线程池创建方式自定义线程池线程池工作原理阻塞队列线程池参数合理配置线程池参数 创建线程 在Java中创建一个线程&#xff0c;有且仅有一种方式&#xff0c;创建一个Thread类实例&#xff0c;并调用它的start方法。 Thread 最经典也…

Selenium使用注意事项:

find_element 和 find_elements 的区别 WebDriver和WebElement的区别 问题&#xff1a; 会遇到报错&#xff1a; selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector",&…

离线下载linux mysql和mysql基本库

下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 选择数据库版本&#xff0c;系统&#xff0c;系统版本信息 下载需要的rpm包&#xff0c;传入服务器&#xff0c;使用yum install xxx.rpm安装即可 mysql-community下载地址 https://dev.mysql.com/downloads/my…

图论---匈牙利算法求二分图最大匹配的实现

开始编程前分析设计思路和程序的整体的框架&#xff0c;以及作为数学问题的性质&#xff1a; 程序流程图&#xff1a; 数学原理&#xff1a; 求解二分图最大匹配问题的算法&#xff0c;寻找一个边的子集&#xff0c;使得每个左部点都与右部点相连&#xff0c;并且没有两条边共享…

如何通过文件分发系统,实现能源电力企业文件的安全分发流转?

随着企业业务的快速发展&#xff0c;能源电力企业会在全国乃至全球&#xff0c;设立总部-分部-办事处/网点等多层级的结构&#xff0c;因此会涉及自动化的文件分发的业务场景。文件分发系统是一种将文件从一个地方自动传输到多个接收者的过程&#xff0c;可以提高工作效率&…

Linux 复现Docker NAT网络

Linux 复现Docker NAT网络 docker 网络的构成分为宿主机docker0网桥和为容器创建的veth 对构成。这个默认网络命名空间就是我们登陆后日常使用的命名空间 使用ifconfig命令查看到的就是默认网络命名空间&#xff0c;docker0就是网桥&#xff0c;容器会把docker0当成路由&…

Prometheus+Grafana主机运行数据

目录 介绍 安装Node Exporter 配置Prometheus 验证配置 导入仪表盘 介绍 Prometheus是一款开源的监控和警报工具&#xff0c;而Node Exporter是Prometheus的一个官方插件&#xff0c;用于采集主机上的各种系统和硬件指标。 安装Node Exporter 下载最新版本的Node Export…

STM32入门开发操作记录(一)——新建工程

目录 一、课程准备1. 课程资料2. 配件清单3. 根目录 二、环境搭建三、新建工程1. 载入器件支持包2. 添加模块3. ST配置4. 外观设置5. 主函数文件 一、课程准备 1. 课程资料 本记录操作流程参考自b站视频BV1th411z7snSTM32入门教程-2023版 细致讲解 中文字幕&#xff0c;课程资…

matine组件库踩坑日记 --- react

Mantine实践 一 禁忌核心css样式二 添加轮播图扩展组件 一 禁忌核心css样式 import React from react import ReactDOM from react-dom/client import { BrowserRouter } from react-router-dom; import App from ./App.jsx import ./index.css import mantine/core/styles.cs…

经典关系抽取(一)CasRel(层叠式指针标注)在DuIE2.0数据集上的应用

经典关系抽取(一)CasRel(层叠式指针标注)在DuIE2.0数据集上的应用 关系抽取&#xff08;Relation Extraction&#xff09;就是从一段文本中抽取出&#xff08;主体&#xff0c;关系&#xff0c;客体&#xff09;这样的三元组&#xff0c;用英文表示是 (subject, relation, obj…

python作业三

1.使用requests模块获取这个json文件http://java-api.super-yx.com/html/hello.json 2.将获取到的json转为dict 3.将dict保存为hello.json文件 4.用io流写一个copy(src,dst)函数,复制hello.json到C:\hello.json import json import shutilimport requests #使用requests模块获…

CDN在App分发中的作用

CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;在App分发中扮演着至关重要的角色。它通过一系列技术手段&#xff0c;将App的内容高效、快速地传递给用户&#xff0c;显著提升用户体验和下载速度。以下是CDN在App分发中的具体作用和优势&#x…

[RuoYi-Vue] - 1. 项目搭建

文章目录 &#x1f42c;初始化后端项目拉取RuoYi-Vue代码Maven构建导入数据库ry-vue修改配置信息启动Redis启动项目 &#x1f30c;初始化前端项目拉取RuoYi-Vue3代码项目运行成功页面 &#x1f42c;初始化后端项目 拉取RuoYi-Vue代码 若依/RuoYi-Vue 代码地址 Maven构建 导入数…

react启用mobx @decorators装饰器语法

react如果没有经过配置&#xff0c;直接使用decorators装饰器语法会报错&#xff1a; Support for the experimental syntax ‘decorators’ isn’t currently enabled 因为react默认是不支持装饰器语法&#xff0c;需要做一些配置来启用装饰器语法。 step1: 在 tsconfig.js…

nginx基本概念和安装

一. 简介 1.1 是什么 nginx是一个高性能的HTTP和反向代理web服务器&#xff0c;是一款轻量级的Web服务器/反向代理服务器/电子邮件(IMAP/POP3)代理服务器&#xff0c;在BSD-like协议下发行&#xff0c;特点是占有内存少&#xff0c;并发能力强。ngnix专为性能优化而开发&#…

如何利用桌面工作计划软件制定自己的to do清单?

在我们的日常生活和工作中&#xff0c;经常会遇到各种各样的任务需要完成。如果没有一个明确的计划和安排&#xff0c;我们可能会感到混乱和压力&#xff0c;而桌面工作计划软件可以帮助我们更好地管理和规划我们的时间和任务。今天&#xff0c;我们就来聊聊如何利用这些工具&a…

Linux 一键部署Mysql 8.4.1 LTS

mysql 前言 MySQL 是一个基于 SQL(Structured Query Language)的数据库系统,SQL 是一种用于访问和管理数据库的标准语言。MySQL 以其高性能、稳定性和易用性而闻名,它被广泛应用于各种场景,包括: Web 应用程序:许多动态网站和内容管理系统(如 WordPress)使用 MySQL 存…

红日靶场----(三)1.漏洞利用

上期已经信息收集阶段已经完成&#xff0c;接下来是漏洞利用。 靶场思路 通过信息收集得到两个吧靶场的思路 1、http://192.168.195.33/phpmyadmin/&#xff08;数据库的管理界面&#xff09; root/root 2、http://192.168.195.33/yxcms/index.php?radmin/index/login&am…