- 题目描述
- 思路
- 枚举
- Python实现
- Java实现
- C++
题目描述
掉落的方块
思路 枚举
用数组heights记录各个方块掉落后的高度。对于第i个掉落的方块,如果底部区间与第j个掉落的方块有重叠,则它掉落后的高度至少为heights[j]+sizei,其中j<i且sizei为第i个掉落的方块的边长。因此对于第i个掉落的方块,heights[i]的初始值为sizei,暴力枚举所有之前掉落的方块,如果两个的底部区间有重叠,则更新heights[i]=max(heights[i], heights[j]+sizei)。
因为要返回一个所有已落稳的方块的最大堆叠高度列表,从i=1开始,不断更新heights,然后返回即可。
class Solution:
def fallingSquares(self, positions: List[List[int]]) -> List[int]:
n = len(positions)
heights = [0] * n
for i, (left1, side1) in enumerate(positions):
right1 = left1 + side1 - 1
heights[i] = side1
for j in range(i):
left2, right2 = positions[j][0], positions[j][0] + positions[j][1] - 1
if right1 >= left2 and right2 >= left1:
heights[i] = max(heights[i], heights[j] + side1)
for i in range(1, n):
heights[i] = max(heights[i], heights[i-1])
return heights
Java实现
class Solution {
public List fallingSquares(int[][] positions) {
int n = positions.length;
List heights = new ArrayList();
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;
}
}
C++
class Solution {
public:
vector fallingSquares(vector>& positions) {
int n = positions.size();
vector heights(n);
for (int i = 0; i < n; i++) {
int left1 = positions[i][0], right1 = positions[i][0] + positions[i][1] - 1;
heights[i] = 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) {
heights[i] = max(heights[i], heights[j] + positions[i][1]);
}
}
}
for (int i = 1; i < n; i++) {
heights[i] = max(heights[i], heights[i - 1]);
}
return heights;
}
};



