左神高级进阶班3(TreeMap顺序表记录线性数据的使用, 滑动窗口的使用,前缀和记录结构, 可能性的舍弃)
目录
【案例1】
【题目描述】
【思路解析】
【代码实现】
【案例2】
【题目描述】
【思路解析】
【代码实现】
【案例3】
【题目描述】
【思路解析】
【代码实现】
【案例4】
【题目描述】
【思路解析】
【代码实现】
【案例1】
【题目描述】

【思路解析】
这里大楼之间有重叠部分,然后让我们描述轮廓线数组,所以我们需要知道每个点的最大高度。因为他每一个楼中间部分是高度相等的,所以我们只需要知道这个点所在地点那个楼是最高的,并且因为楼中间部分高度相等,所以我们只关心每栋楼的开始位置和结束位置。我们可以通过matrix构建一个这样的数组【数组存放结点,结点包括位置,升降情况,高度三个信息】,数组通过位置和升降情况来进行排序,(1)先按照位置来排序,升序(2)如果两个位置相同,则开始位置(升的情况)排在前。
通过这样的顺序数组,我们就可以构建一个高度和出现的顺序表,升就添加一个记录,降就删除一个记录,如果记录为0,则删除。通过这个顺序表,就可以知道当前位置的最大高度(位置和最大高度的关系也构建一个顺序表存放,使在生成轮廓时,轮廓位置变化是有序的),通过高度的变化我们就可以知道轮廓的变化,然后通过位置和最大高度的顺序表构建轮廓数组。
【代码实现】
package AdvancedPromotion3;import java.util.*;/*** @ProjectName: study3* @FileName: Ex1* @author:HWJ* @Data: 2023/9/18 10:27*/
public class Ex1 {public static void main(String[] args) {int[][] matrix = {{2, 5, 6}, {1, 7, 4}, {4, 6, 7}, {3, 6, 5}, {10, 13, 2}, {9, 11, 3}, {12, 14, 4}, {10, 12, 5}};List<List<Integer>> ans = getContourMatrix(matrix);for (List<Integer> integers : ans) {for (int i : integers) {System.out.print(i + " ");}System.out.println();}}public static class Node {int x;boolean isAdd; // true 表示当前为一个楼的开始, false表示当前地点为一个楼的结束int height;public Node(int x, boolean isAdd, int height) {this.x = x;this.isAdd = isAdd;this.height = height;}}public static class NodeComparator implements Comparator<Node> {@Overridepublic int compare(Node o1, Node o2) {if (o1.x != o2.x) {return o1.x - o2.x;}if (o1.isAdd != o2.isAdd) {return o1.isAdd ? -1 : 1;}return 0;}}public static List<List<Integer>> getContourMatrix(int[][] matrix) {Node[] nodes = new Node[matrix.length * 2];for (int i = 0; i < matrix.length; i++) {nodes[i * 2] = new Node(matrix[i][0], true, matrix[i][2]);nodes[i * 2 + 1] = new Node(matrix[i][1], false, matrix[i][2]);}Arrays.sort(nodes, new NodeComparator());TreeMap<Integer, Integer> heightAndNums = new TreeMap<>();TreeMap<Integer, Integer> maxHeight = new TreeMap<>();for (Node node : nodes) {if (node.isAdd) {if (!heightAndNums.containsKey(node.height)) { //如果不存在就新建记录heightAndNums.put(node.height, 1);} else {heightAndNums.put(node.height, heightAndNums.get(node.height) + 1);}} else {if (heightAndNums.get(node.height) == 1) { // 如果只剩一条记录了就直接删除heightAndNums.remove(node.height);} else {heightAndNums.put(node.height, heightAndNums.get(node.height) - 1);}}if (heightAndNums.isEmpty()) { // 这里通过顺序表记录当前结点的最大高度maxHeight.put(node.x, 0);} else {maxHeight.put(node.x, heightAndNums.lastKey());}}int preHeight = 0;int start = 0;List<List<Integer>> res = new ArrayList<>();for (int x : maxHeight.keySet()) {int curHeight = maxHeight.get(x);if (preHeight != curHeight) { // 如果高度发生了变化,就构建轮廓if (preHeight != 0) { // 如果之前的高度为0, 说明之前的那个地方到现在的地方没有楼res.add(new ArrayList<>(Arrays.asList(start, x, preHeight)));}preHeight = curHeight;start = x;}}return res;}
}
【案例2】
【题目描述】

【思路解析】
用滑动窗口解决,如果当前窗口的元素和大于k,l++,小于k,r++,如果==k,记录答案,并且r++。
因为是正数数组,所以滑动窗口在移动过程能维持单调性。保证答案的正确性。
【代码实现】
package AdvancedPromotion3;/*** @ProjectName: study3* @FileName: Ex2* @author:HWJ* @Data: 2023/9/18 11:07*/
public class Ex2 {public static void main(String[] args) {int[] arr = {1,2,3,1,1,1,2,1,1,3};System.out.println(getMaxLen(arr, 3));}public static int getMaxLen(int[] arr, int k){int l = 0;int r = 0;int sum = 0;int res = -1;while (r < arr.length){if (sum == k){res = Math.max(r - l + 1, res);r++;if (r == arr.length){break;}sum += arr[r];}if (sum > k){sum -= arr[l++];}if (sum < k){r++;if (r == arr.length){break;}sum += arr[r];}}return res;}
}
【案例3】
【题目描述】
给定一个无序数组arr,其中元素可正、可负、可0,给定一个整数k。求arr所有的子数组中累加和等于k的最长子数组长度。
【思路解析】
构建一个哈希表,里面放入前缀和和达到这个前缀和的索引位置。加入k = 5。
哈希表有一个记录为 12,i。表示 0--i、这所有的元素和为12,如果在遍历中有一次前缀和为17,所有为j(j > i),则i+1 --- j的累加和应该为k。记录答案即可。
【代码实现】
package AdvancedPromotion3;import java.util.HashMap;/*** @ProjectName: study3* @FileName: Ex3* @author:HWJ* @Data: 2023/9/18 11:17*/
public class Ex3 {public static void main(String[] args) {}public static int getMaxLen(int[] arr, int k){if (arr.length == 0){return 0;}HashMap<Integer, Integer> sumIndex = new HashMap<>();sumIndex.put(0, -1);int res = -1;int sum = 0;for (int i = 0; i < arr.length; i++) {sum += arr[i];if (sumIndex.containsKey(sum - k)){res = Math.max(res, i - sumIndex.get(sum - k));}sumIndex.put(sum, i);}return res;}
}
【案例4】
【题目描述】

【思路解析】
构建两个数组表示,一个数组minSum【i】表示从i开始最远能达到的地方,并且使这个子数组的和最小;minIndex【i】表示从i开始最远能达到的地方的索引。
例如:表格第一行表示无序数组arr,第二行表示minSum,第三行表示minIndex
| 3 | -2 | -4 | 0 | 6 |
| -3 | -6 | -4 | 0 | 6 |
| 3 | 3 | 3 | 3 | 4 |
得到这个之后就相当于把一个数组分成了几个部分,然后我们通过minIndex可以找到下一个部分的开头,我们只考虑下一次能不能加入下一个部分。
例如

我们在第0位置开始遍历,加入了三个部分,达到了k位置,但是他不能加入下一个部分了,我们便从1开始遍历,看他能不能加入下一个部分。我们默认1-k合法,因为如果他不合法,他一定不能加入下一个部分,所以他的有效大小一定小于0-k,我们需要求最大有效长度,所以它一定不是有效解,所以我们直接默认他为合法,只有他能加入下一个区域,我们才把他作为答案的可能,这样可以舍弃很多无效可能性,降低算法复杂度。
【代码实现】
package AdvancedPromotion3;/*** @ProjectName: study3* @FileName: Ex4* @author:HWJ* @Data: 2023/9/18 12:10*/
public class Ex4 {public static void main(String[] args) {int[] arr = {3,-2,-4,0,6};System.out.println(getMaxLen(arr, -2));}public static int getMaxLen(int[] arr, int k){int n = arr.length;int[] minSub = new int[n];int[] minIndex = new int[n];minSub[n - 1] = arr[n - 1];minIndex[n - 1] = arr[n - 1];for (int i = n - 2; i >= 0; i--) {if (minSub[i + 1] <= 0){minSub[i] = arr[i] + minSub[i + 1];minIndex[i] = minIndex[i + 1];}else {minSub[i] = arr[i];minIndex[i] = i;}}int res = 0;int p = 0;int sum = 0;boolean loop =true; // 使第一次进入求解答案时,能正确进入循环for (int i = 0; i < n; i++) {while (p < n && (loop || sum <= k)){ // 这里不初始化p 和 sum,这样可以舍弃大量不是最优解的解。res = Math.max(res, p - i);sum += minSub[p];p = minIndex[p] + 1;loop = false;}sum -= arr[i];}return res;}
}
相关文章:
左神高级进阶班3(TreeMap顺序表记录线性数据的使用, 滑动窗口的使用,前缀和记录结构, 可能性的舍弃)
目录 【案例1】 【题目描述】 【思路解析】 【代码实现】 【案例2】 【题目描述】 【思路解析】 【代码实现】 【案例3】 【题目描述】 【思路解析】 【代码实现】 【案例4】 【题目描述】 【思路解析】 【代码实现】 【案例1】 【题目描述】 【思路解析】 这里…...
Linux线程
1.进程是资源管理的最小单位,线程是程序执行的最小单位。 2.每个进程有自己的数据段、代码段和堆栈段。线程通常叫做轻型的进程,它包含独立的栈和CPU寄存器状态,线程是进程的一条执行路径,每个线程共享其所附属进程的所有资源,包括…...
C++ 太卷,转 Java?
最近看到知乎、牛客等论坛上关于 C 很多帖子,比如: 2023年大量劝入C 2023年还建议走C方向吗? 看了一圈,基本上都是说 C 这个领域唯一共同点就是都使用 C 语言,其它几乎没有相关性。 的确是这样,比如量化交…...
《Java并发编程实战》第2章-线程安全性
0.概念理解 对象状态:存储在状态变量(例如实例或静态域)中的数据; 线程安全性:当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的; 竞态条件&…...
二蛋赠书三期:《C#入门经典(第9版)》
文章目录 前言活动规则参与方式本期赠送书籍介绍作者介绍内容简介读者对象获奖名单 结语 前言 大家好!我是二蛋,一个热爱技术、乐于分享的工程师。在过去的几年里,我一直通过各种渠道与大家分享技术知识和经验。我深知,每一位技术…...
Augmented Large Language Models with Parametric Knowledge Guiding
本文是LLM系列文章,针对《Augmented Large Language Models with Parametric Knowledge Guiding》的翻译。 参数知识引导下的增强大型语言模型 摘要1 引言2 相关工作3 LLM的参数化知识引导4 实验5 结论 摘要 大型语言模型(LLM)凭借其令人印…...
Docker启动Mysql容器并进行目录挂载
一、创建挂载目录 mkdir -p 当前层级下创建 mkdir -p mysql/data mkdir -p mysql/conf 进入到conf目录下创建配置文件touch hym.conf 并把配置文件hmy.conf下增加以下内容使用vim hym.conf即可添加(cv进去就行) Esc :wq 保存 [mysqld] skip-name-resolve character_set_…...
力扣刷题(简单篇):两数之和、两数相加、无重复字符的最长子串
坚持就是胜利 一、两数之和 题目链接:https://leetcode.cn/problems/two-sum/ 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应…...
Spark的基础
实训笔记--Spark的基础 Spark的基础一、Spark的诞生背景二、Spark概念2.1 Spark Core2.2. Spark SQL2.3 Spark Streaming2.4 Spark MLlib2.5 Spark GraphX2.6 Spark R 三、Spark的特点3.1 计算快速3.2 易用性3.3 兼容性3.4 通用性 四、Spark的安装部署4.1 Spark的安装部署就是安…...
如何在idea中新建第一个java小程序
如何在idea中新建第一个java小程序 1.打开软件2.新建项目3.找到安装的jdk文件路径4.继续下一步5.创建项目名称并配置项目路径6.点击完成即可。7.在项目文件的src文件夹下创建java类,程序等7.1其他java项目或文件不能运行的原因: 8.新建类并运行程序9.输入…...
AOP全局异常处理
AOP全局异常处理 由于Controller可能接收到来自业务层、数据层、数据库抛出的异常,因此需要使用AOP思想,进行全局异常处理,异常可通过调试获得。 package org.sinian.reggie.common;import lombok.extern.slf4j.Slf4j; import org.springfram…...
一阶低通滤波器滞后补偿算法
一阶低通滤波器的推导过程和双线性变换算法请查看下面文章链接: PLC算法系列之数字低通滤波器(离散化方法:双线性变换)_双线性离散化_RXXW_Dor的博客-CSDN博客PLC信号处理系列之一阶低通(RC)滤波器算法_RXXW_Dor的博客-CSDN博客_rc滤波电路的优缺点1、先看看RC滤波的优缺点…...
JS中Symbol的介绍
1、 引入Symbol类型的背景 ES5 的对象属性名都是字符串,这容易造成属性名冲突的问题 举例: 使用别人的模块/对象, 又想为之添加新的属性,这就容易使得新属性名与原有属性名冲突 2、Symbol类型简介 symbol是一种原始数据类型 其余原始类型: 未定义(undefined) 、…...
封装统一响应结果类和消息枚举类
在开发中,响应结果都需要统一格式,下面给出一个例子,可自行修改。 package com.lili.utils;import com.fasterxml.jackson.annotation.JsonInclude; import com.lili.enums.AppHttpCodeEnum;import java.io.Serializable;/*** author YLi_Ji…...
应广单片机实现红蓝双色爆闪灯
继续进行点灯,今天来点简单的,红蓝双色爆闪灯,上电即可爆闪,红色接pa.3.pa.4,蓝色接pa6.和pa.7,低电平点亮LED灯,想要高电平点亮,或是驱动N管点亮灯,可以稍作修改。端口电平输出0改1,…...
深入了解OSI模型:计算机网络的七大层次
目录 OSI模型 物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 OSI模型 OSI模型是一个网络通信的概念模型,用于描述计算机网络中各个不同层次之间的通信和功能。它将网络通信分为七个不同的层次,每个层次负责不同的任务,使得网…...
games101 作业2
题目 光栅化一个三角形 1. 创建三角形的 2 维 bounding box。 2. 遍历此 bounding box 内的所有像素(使用其整数索引)。然后,使用像素中心的屏幕空间坐标来检查中心点是否在三角形内。 3. 如果在内部,则将其位置处的插值深度值 (…...
二叉树链式存储结构
目录 1.二叉树链式存储结构 2.二叉树的遍历 2.1 前、中、后序遍历 2.2 层序遍历 3.二叉树的其他递归问题 3.1 二叉树的结点个数 3.2 二叉树的叶子结点个数 3.3 二叉树第k层结点个数 3.4 二叉树的深度 3.5 二叉树查找 3.6 二叉树销毁 4.二叉树的基础OJ题 4.1 单值…...
Claude 使用指南 | 可与GPT-4媲美的语言模型
本文全程干货,让你轻松使用上claude,这也是目前体验cluade的唯一途径!废话不多说,直接上教程,cluade的能力不逊于GPT4,号称是ChatGPT4.0最强竞品。相对Chatgpt来说,Claude不仅是完全免费的&…...
【汇编】微处理器
【汇编】微处理器 文章目录 【汇编】微处理器1、微处理器概念1.1 关键词1.2 分类 2、微处理器结构2.1 寄存器2.2 寄存器&汇编助记符2.3 寄存器组成结构 3、地址空间3.1 存储空间3.1.1 虚拟空间(编程空间)3.1.2 线性空间 3.2 I/O空间 4、工作模式4.1 …...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
