力扣(leetcode)每日一题 699 掉落的方块 | 线段树|经典

server/2024/10/9 2:52:06/

699. 掉落的方块

题干

在二维平面上的 x 轴上,放置着一些方块。
给你一个二维整数数组 positions ,其中 positions[i] = [lefti, sideLengthi] 表示:第 i 个方块边长为 sideLengthi ,其左侧边与 x 轴上坐标点 lefti 对齐。
每个方块都从一个比目前所有的落地方块更高的高度掉落而下。方块沿 y 轴负方向下落,直到着陆到 另一个正方形的顶边 或者是 x 轴上 。一个方块仅仅是擦过另一个方块的左侧边或右侧边不算着陆。一旦着陆,它就会固定在原地,无法移动。
在每个方块掉落后,你必须记录目前所有已经落稳的 方块堆叠的最高高度 。
返回一个整数数组 ans ,其中 ans[i] 表示在第 i 块方块掉落后堆叠的最高高度。

题解

这个题目不仅需要用线段树,在进行线段树初始化的时候还有一个非常重要的技巧

java">class Solution {public static List<Integer> fallingSquares(int[][] positions) {TreeSet<Integer> treeSet = new TreeSet<>();for (int[] position : positions) {treeSet.add(position[0]);treeSet.add(position[0] + position[1] - 1);}HashMap<Integer, Integer> map = new HashMap<>();int count = 1;for (Integer i : treeSet) {map.put(i, count);count++;}SegmentTree segmentTree = new SegmentTree(map.size());segmentTree.build(positions, map);return segmentTree.getResult();}// 位置1 位置2   遍历位置  数量累加?public static class SegmentTree {int root = 1;int left = 1;int right;int[] maxArr;int[] updateArr; // 反正不会更新为0List<Integer> collect = new ArrayList<>();public SegmentTree(int n) {int length = n + 1;right = n;maxArr = new int[length * 4];updateArr = new int[length * 4];}public void update(int start, int end, int value) {update(start, end, value, left, right, root);}public void update(int start, int end, int value, int left, int right, int node) {if (start <= left && right <= end) {updateArr[node] = value;maxArr[node] = value;return;}int mid = (left + right) / 2;if (start <= mid) {update(start, end, value, left, mid, node * 2);}if (mid < end) {update(start, end, value, mid + 1, right, node * 2 + 1);}maxArr[node] = Math.max(maxArr[node * 2], maxArr[node * 2 + 1]);}public int getMax(int start, int end) {return getMax(start, end, left, right, root);}public int getMax(int start, int end, int left, int right, int node) {if (start <= left && right <= end) {return maxArr[node];}int mid = (left + right) / 2;int max = 0;int max2 = 0;// 刷新if (updateArr[node] != 0) {// 下发任务updateArr[node * 2] = updateArr[node];updateArr[node * 2 + 1] = updateArr[node];maxArr[node * 2] = updateArr[node];maxArr[node * 2 + 1] = updateArr[node];updateArr[node] = 0;}if (start <= mid) {max = getMax(start, end, left, mid, node * 2);}if (mid < end) {max2 = getMax(start, end, mid + 1, right, node * 2 + 1);}return Math.max(max, max2);}int curMax = 0;public void build(int[][] positions, HashMap<Integer, Integer> map) {for (int[] position : positions) {int i1 = position[0]; // 2,2      2,3 算头不算尾int i2 = position[1];Integer index1 = map.get(i1);Integer index2 = map.get(i1 + i2 - 1);// 获取范围上的最大值int max = getMax(index1, index2); // 范围 i1, i1 + i2update(index1, index2, max + i2);curMax = Math.max(curMax, max + i2);collect.add(curMax);}}public List<Integer> getResult() {return collect;}}}
总结

还是去网上找视频看把,这个真不好解释

首先正放心 4,6 会落在4,6和10,6的位置,但是10,6的位置是没有支点的,也就是用不了的。因为这时候10位置来了方块,是无法累加上去的
然后这里不能记录4,6 5,6 6,6 7,6 8,6 9,6 这里需要对点进行map的压缩。
这样只要头尾的点就可以了。
也就是你会有很多点 数值很大 100,10000,555555,666666,666669
但是会通过hash映射到 1,2,3,4,5上。非常的紧凑


http://www.ppmy.cn/server/129052.html

相关文章

前端编程艺术(3)---JavaScript

目录 1.JavaScript 1.输出 2.变量和数据类型 3.运算符 4.数组 5.函数 6.面向对象 7.ES6面向对象 2.BOM 1.document对象 3.DOM 4.JSON 1.JavaScript JavaScript是一种脚本编程语言&#xff0c;通常用于为网页增加交互性和动态效果。它是一种高级语言&#xff…

C语言— exec系列函数

exec系列函数 在C语言编程中&#xff0c;exec 系列函数用于在当前进程中执行一个新程序&#xff0c;从而替换当前进程的映像。这些函数不会返回&#xff0c;除非发生错误。exec 系列函数有多个变体&#xff0c;其中最常用的包括 execl, execle, execlp, execv, execve, execvp…

Jmeter生成JWT token

JWT简介 JWT官网&#xff1a;https://jwt.io/ JSON Web令牌&#xff08;JWT&#xff09;是一个开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑而自包含的方式&#xff0c;用于在各方之间以JSON对象的形式安全地传输信息。此信息可以验证和信任&#x…

在PC端连接苹果手机(iPhone)时,即使已经开启了开发者模式(开发者权限),但仍然无法成功连接,是什么原因?

目录 1. 缺少信任设备授权 2. USB线或端口问题 3. 没有安装正确的驱动程序 4. Apple Mobile Device 服务未启动&#xff08;适用于 Windows&#xff09; 5. 开发者选项中的设置问题 6. 防火墙或杀毒软件阻止 7. USB 限制功能已开启 8. 软件版本不兼容 9. iPhone处于恢…

APP自动化搭建与应用

APP自动化环境搭建 用于做APP端UI自动化&#xff0c;adb连接手机设备。 需要的工具java编辑器&#xff1a;jdk、Android-sdk软件开发工具组、appium的python客户端、nodes.js、夜神模拟器、apk包、uiautomatorviewer 第一步&#xff1a;安装sdk&#xff0c;里面包含建立工具bu…

【数据分享】1901-2023年我国省市县三级逐月最高气温数据(免费获取/Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月最高气温栅格数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff0c;该数据来源于国家青藏高原科学数据中心&#xff0c;很多小伙伴拿到数据后反馈栅格数据不太方便使用&#xff0c;问我们能不能把数据处理为更方便使用的Sh…

PHP变量(第④篇)

本栏目教学是php零基础到精通&#xff0c;如果你还没有安装php开发工具请查看下方链接&#xff1a; Vscode、小皮面板安装-CSDN博客 今天来讲一讲php中的变量&#xff0c;变量是用于存储信息的"容器"&#xff0c;这些数据可以在程序执行期间被修改&#xff08;即其…

python实战四:输入一个年份,判断是否是闰年

问题&#xff1a; 从键盘获取一个四位的整数年份&#xff0c;判断其是否是闰年。闰年的判断条件为︰能被4整除但不能被100整除&#xff0c;或者能被400整除。 需求方法&#xff1a; 使用 input() 函数从键盘获取输入。输入的年份是一个字符串。检查输入是否为四位数&#xf…