在二维平面上的 x 轴上,放置着一些方块。
给你一个二维整数数组 positions ,其中 positions[i] = [lefti, sideLengthi] 表示:第 i 个方块边长为 sideLengthi ,其左侧边与 x 轴上坐标点 lefti 对齐。
每个方块都从一个比目前所有的落地方块更高的高度掉落而下。方块沿 y 轴负方向下落,直到着陆到 另一个正方形的顶边 或者是 x 轴上 。一个方块仅仅是擦过另一个方块的左侧边或右侧边不算着陆。一旦着陆,它就会固定在原地,无法移动。
在每个方块掉落后,你必须记录目前所有已经落稳的 方块堆叠的最高高度 。
返回一个整数数组 ans ,其中 ans[i] 表示在第 i 块方块掉落后堆叠的最高高度。
输入:positions = [[1,2],[2,3],[6,1]]
输出:[2,5,5]
解释:
第 1 个方块掉落后,最高的堆叠由方块 1 组成,堆叠的最高高度为 2 。
第 2 个方块掉落后,最高的堆叠由方块 1 和 2 组成,堆叠的最高高度为 5
第 3 个方块掉落后,最高的堆叠仍然由方块 1 和 2 组成,堆叠的最高高度为 5 。
因此,返回 [2, 5, 5] 作为答案。
。
package 分段树;
import java.util.*;
//leetcode submit region begin(Prohibit modification and deletion)
class FallingSquares699 {
// public List<Integer> fallingSquares(int[][] positions) {
// Set<int[]> set = new TreeSet<>(new Comparator<int[]>() {
// @Override
// public int compare(int[] o1, int[] o2) {
// return o1[0] - o2[0];
// }
// });
// List<Integer> res = new ArrayList<>();
// res.add(positions[0][1]);
// set.add(new int[]{positions[0][0], positions[0][0]+positions[0][1], positions[0][1]});
// int curMaxHight = 0;
// for (int i = 1; i < positions.length; i++) {
// int[] curArr = new int[]{positions[i][0], positions[i][0]+positions[i][1], positions[i][1]};
// List<int[]> list = new ArrayList<>();
// boolean isOver = true;
// while (set.size() != 0) {
// int[] curSetArr = ((TreeSet<int[]>) set).pollFirst();
// if (curArr[1] <= curSetArr[0]) {
// set.add(new int[]{curArr[0], curArr[1], curMaxHight+curArr[2]});
// set.add(curSetArr);
// curMaxHight = curMaxHight+curArr[2];
// isOver = true;
// break;
// } else if (curArr[0] <= curSetArr[0] && curArr[1] <= curSetArr[1]) {
// set.add(new int[]{curArr[0], curArr[1], Math.max(curMaxHight, curSetArr[2])+curArr[2]});
// if (curArr[1] < curSetArr[1]) {
// set.add(new int[]{curArr[1], curSetArr[1], curSetArr[2]});
// }
// isOver = true;
// curMaxHight = Math.max(curMaxHight, Math.max(curMaxHight, curSetArr[2])+curArr[2]);
// break;
// } else if (curArr[0] <= curSetArr[0] && curArr[1] > curSetArr[1]) {
// curMaxHight = 0;
// curMaxHight = Math.max(curMaxHight, curSetArr[2]);
// isOver = false;
//// curArr[2] = curMaxHight;
// } else if (curArr[0] >= curSetArr[1]) {
// curMaxHight = 0;
// list.add(new int[]{curSetArr[0], curSetArr[1], curSetArr[2]});
// isOver = false;
// } else if (curArr[0] >= curSetArr[0] && curArr[1] <= curSetArr[1]) {
// if (curArr[0] > curSetArr[0]) {
// set.add(new int[]{curSetArr[0], curArr[1], curSetArr[2]});
// }
// set.add(new int[]{curArr[0], curArr[1], curArr[2]+Math.max(curMaxHight, curSetArr[2])});
// if (curArr[1] < curSetArr[1]) {
// set.add(new int[]{curArr[0], curSetArr[1], curSetArr[2]});
// }
// curMaxHight = Math.max(curMaxHight, Math.max(curMaxHight, curSetArr[2])+curArr[2]);
// isOver = true;
// break;
// } else if (curArr[0] >= curSetArr[0] && curArr[1] > curSetArr[1]) {
// curMaxHight = 0;
// if (curArr[0] > curSetArr[0]) {
// list.add(new int[]{curSetArr[0], curArr[0], curSetArr[2]});
// }
// curMaxHight = Math.max(curMaxHight, curSetArr[2]);
// isOver = false;
//// curArr[2] = curMaxHight;
// }
// }
// if (!isOver) {
// set.add(new int[]{curArr[0], curArr[1], curArr[2]+curMaxHight});
// }
// for (int j = 0; j < list.size(); j++) {
// set.add(list.get(j));
// }
// int currentMax = 0;
// Iterator<int[]> iteratorSet = set.iterator();
// while(iteratorSet.hasNext()){
// currentMax = Math.max(iteratorSet.next()[2], currentMax);
// }
// res.add(currentMax);
// }
// return res;
// }
public List<Integer> fallingSquares(int[][] positions) {
int n = positions.length;
List<Integer> heights = new ArrayList<Integer>();
for (int i = 0; i < n; i++) {
int left1 = positions[i][0], right1 = positions[i][0] + positions[i][1] - 1;
int height = positions[i][1];
for (int j = 0; j < i; j++) {
int left2 = positions[j][0], right2 = positions[j][0] + positions[j][1] - 1;
if (right1 >= left2 && right2 >= left1) {
height = Math.max(height, heights.get(j) + positions[i][1]);
}
}
heights.add(height);
}
for (int i = 1; i < n; i++) {
heights.set(i, Math.max(heights.get(i), heights.get(i - 1)));
}
return heights;
}
public static void main(String[] args) {
FallingSquares699 so = new FallingSquares699();
List<Integer> a = so.fallingSquares(new int[][]{
{4, 9}, {8, 8}, {6, 8}, {1, 2}
});
int b = 1;
}
}
//leetcode submit region end(Prohibit modification and deletion)
刷题进行时-线段树-699. 掉落的方块
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 699 Falling Squares 掉落的方块 Description:There are several s...
- 今天分享一个LeetCode题,题号是699,标题是掉落的方块,题目标签是线段树,题目难度是困难。 这篇文章写着写...
- 线段树(又称区间树), 是一种高级数据结构,他可以支持这样的一些操作: 查找给定的点包含在了哪些区间内 查找给定的...
- 在做两道区间检索题中接触到了线段树的概念,本文将其进行整理,文末几篇参考对线段树做了系统的介绍,结合两道leetc...