左神高级进阶班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 …...
按键点亮led灯
原理图: K0这个按键按下时,开发板D1这个灯亮,松开,灯灭 代码如下: #include "stm32f4xx.h" void LED_Init(void) {//1.定义一个GPIO外设的结构体变量 GPIO_InitTypeDef GPIO_InitStructure;//RCC_AHB1PeriphClockCmd(RCC_AHB1Pe…...
Java常见面试题
目录 1、mysql并发事务会带来哪些问题,如何解决?2、请详细描述Redis持久化机制?3、简述Redis缓存雪崩和缓存穿透的问题和解决方案?4、RabbitMQ消息丢失及对应解决方案5、什么叫线程安全?举例说明6、举例说明常用的加密…...
笔记1.5:计算机网络体系结构
从功能上描述计算机网络结构 分层结构 每层遵循某个网络协议完成本层功能 基本概念 实体:表示任何可发送或接收信息的硬件或软件进程。 协议是控制两个对等实体进行通信的规则的集合,协议是水平的。 任一层实体需要使用下层服务,遵循本层…...
【Python】Python 连接字符串应优先使用 join 而不是 +
Python 连接字符串应优先使用 join 而不是 简介 字符串处理在大多数编程程序语言中都不可避免,字符串的连接也是在编程过程中经常需要面对的问题。 Python中的字符串与其他一些程序语言如C、Java有一些不同,它为不 可变对象。 一旦创建便不能改变&…...
uniapp 小程序 父组件调用子组件方法
答案:配合小程序API > this.selectComponent(""),来选择组件,再使用$vm选择组件实例,再调用方法,或者data 1 设置组件的id,如果你的多端,请跟据情况设置ref,class,id,以便通过小…...
Vue-01:MVVM数据双向绑定与Vue的生命周期
一、Vue介绍 1.1 什么是Vue ? Vue是一个渐进式的JavaScript框架,用于构建用户界面。"渐进式"意味着Vue的设计理念是逐步增强应用的功能和复杂性,而不是一次性地引入所有功能。这使得开发者可以根据项目需求选择性地使用Vue的不同特…...
数据通信网络之OSPFv3基础
文章及资源归档至【AIShareLab】,回复 通信系统与网络 可获取。 文章目录 一、目的二、拓扑三、需求四、步骤 一、目的 掌握路由器的IPv6 基础配置。掌握OSPFv3(单区域)的基础配置。 二、拓扑 如图1 所示,三台路由器R1、R2 和R…...
FPGA-结合协议时序实现UART收发器(五):串口顶层模块UART_TOP、例化PLL、UART_FIFO、uart_drive
FPGA-结合协议时序实现UART收发器(五):串口顶层模块UART_TOP、例化PLL、UART_FIFO、uart_drive 串口顶层模块UART_TOP、例化PLL、UART_FIFO、uart_drive,功能实现。 文章目录 FPGA-结合协议时序实现UART收发器(五&…...
我学编程全靠B站了,真香-国外篇(第三期)
你好,我是Martin。 今天来点猛料,给大家推荐点我的压箱收藏-国外知名大学的公开课。 我推荐的不多,本着少就是多的原则,只给大家推荐我看过最好的五门视频,主要是来自两所国外高校:MIT美国麻省理工、CMU卡…...
c++ 变量常量指针练习题
Q1:在win32 x86模式下,int *p; int **pp; double *q; 请说明p、pp、q各占几个字节的内存单元。 p 占 4 个字节 pp 占 4 个字节 q 占 4 个字节 Q2常量1、1.0、“1”的数据类型是什么? 1 是 整形 int 1.0 是 浮点型 double “1” 是 const char * Q3 语句&…...
个人网站怎么备案可以做哪些/搜狗首页排名优化
PS对街拍女孩照片增加质感(2019-03-19 17:57)PS制作水火相溶特效文字图片(2019-03-19 17:49)PS制作简洁漂亮的立体抽丝文字(2019-03-19 17:16)PS制作科幻特效的金色立体文字(2019-03-19 17:13&a…...
手机微网站素材/企业seo案例
http://www.bbc.co.uk/worldservice/learningenglish/flatmates/archiveepisode.shtml E-24 E-23 E-22 porpoisedolphin 发音类似purpose E-21 Exhausted 耗尽的 worn-out 精疲力竭的 My treat! 我请客。 What’s come over you? 你怎么了&…...
如何做网络营销推广南宁/seo免费优化公司推荐
1、家里可以没有电视机,但一定要有电脑。再大的电视也只是摆设,电脑才是生活之必需。 2、坚决信奉“有问题,百度一下”,无论什么问题,都习惯上网搜索一下,包括不会写的字。 3、电脑里一定有聊天工具。不联…...
wordpress评论嵌套样式修改/ks刷粉网站推广马上刷
什么是NPOI NPOI是一个开源的C#读写Excel、WORD的组件,可以在没有安装Office的情况下对Word或Excel文档进行读写操作。 使用NPOI的优势 (1)完全开源 (2)包含了大部分EXCEL的特性(单元格样式、数据格式、公式等等) …...
丽水网站建设/搜索网站哪个好
简介swoft是基于swoole协程2.x的高性能PHP微服务框架,内置http服务器。框架全协程实现,性能优于传统的php-fpm模式。基于swoole易扩展内置http协程服务器MVC分层设计高性能路由全局容器注入高性能RPC服务治理熔断、降级、负载、注册与发现RPC服务连接池M…...
静态网站 搜索功能/晨阳seo顾问
Skywalking专门为微服务架构和云原生架构系统而设计并且支持分布式链路追踪的APM系统,即应用性能监控系统,为微服务架构和云原生架构系统设计。它通过探针自动收集所需的指标,并进行分布式追踪。通过这些调用链路以及指标,Skywalk…...