大家好,我是 @负雪明烛。点击右上方的「+关注」↗,优质题解不间断!
题目大意
就是我们玩的俄罗斯方块。但只有正方形,且正方形的大小不固定。正方形的底部有粘性,只要跟已有图形有任何的重叠,就可以固定在一起。
如下图所示。
解题方法
分析
本题主要需要解决两个问题:
- 当每次落下来一个方块的时候,我们需要判断它会落在哪个格子的上面。
 
- 由于格子能堆叠,因此需要能知道当前格子的真实高度。
 
我们知道,当一个格子落到其他格子上面以后,后来的格子就只能继续向上堆。所以我们可以把已经落稳了的格子,变成长方形,且把与其有交集格子中重叠的部分覆盖了。
所以,暴力的方法很简单。
- 按照顺序下落格子;
 - 找到在它下落前的格子中,与其有交集的格子;
 - 取有交集的格子中的最大高度 + 当前格子的变长,作为此格子的高度。
 - 把当前的格子的 
[左端点,右端点,高度]保存下来。 - 将当前所有格子中的最大高度,保存为结果。
 
代码
Python 代码如下:
class Solution {public:vector<int> fallingSquares(vector<vector<int>>& positions) {const int N = positions.size();int maxHeight = 0;vector<Interval> intervals;vector<int> res;// 遍历每个正方形for (int i = 0; i < N; ++i) {// 当前正方形的属性int height = positions[i][1];int start = positions[i][0];int end = start + height;// 与之前的图形交集中的最大的高度int baseHeight = 0;// 找之前掉落的图形中有交集的for (Interval interval : intervals) {if (interval.start >= end || interval.end <= start) {continue;}// 交集中取最大高度baseHeight = max(baseHeight, interval.height);}// 新高度int newHeight = height + baseHeight;// 把当前的正方形(高度为其新高度)放入历史图形中intervals.push_back(Interval(start, end, newHeight));// 更新最大高度maxHeight = max(maxHeight, newHeight);// 更新结果res.push_back(maxHeight);}return res;}struct Interval {int start;int end;int height;Interval(int start, int end, int height): start(start), end(end), height(height) {}};};
复杂度
- 时间复杂度:
,
是格子的个数。
 - 空间复杂度:
。
 
总结
- 把问题抽象出来,代码不难写。
 
我是 @负雪明烛 ,刷算法题 1000 多道,写了 1000 多篇算法题解,收获阅读量 300 万。
关注我,你将不会错过我的精彩动画题解、面试题分享、组队刷题活动,进入主页 @负雪明烛 右侧有刷题组织,从此刷题不再孤单。
- 在刷题的时候,如果你不知道该怎么刷题,可以看 LeetCode 应该怎么刷?
 - 如果你觉得题目太多,想在短时间内快速提高,可以看 LeetCode 最经典的 100 道题。
 - 送你一份刷题的代码模板:【LeetCode】代码模板,刷题必会
 - 我写的 1000 道 LeetCode 题解,都在这里了,免费拿走。
 
