2022-05-26每日一题

699. 掉落的方块

在二维平面上的 x 轴上,放置着一些方块。

给你一个二维整数数组 positions ,其中 positions[i] = [lefti, sideLengthi] 表示:第 i 个方块边长为 sideLengthi ,其左侧边与 x 轴上坐标点 lefti 对齐。

每个方块都从一个比目前所有的落地方块更高的高度掉落而下。方块沿 y 轴负方向下落,直到着陆到 另一个正方形的顶边 或者是 x 轴上 。一个方块仅仅是擦过另一个方块的左侧边或右侧边不算着陆。一旦着陆,它就会固定在原地,无法移动。

在每个方块掉落后,你必须记录目前所有已经落稳的 方块堆叠的最高高度 。

返回一个整数数组 ans ,其中 ans[i] 表示在第 i 块方块掉落后堆叠的最高高度。

示例 1:
在这里插入图片描述

输入:positions = [[1,2],[2,3],[6,1]]
输出:[2,5,5]
解释:
第 1 个方块掉落后,最高的堆叠由方块 1 组成,堆叠的最高高度为 2 。
第 2 个方块掉落后,最高的堆叠由方块 1 和 2 组成,堆叠的最高高度为 5 。
第 3 个方块掉落后,最高的堆叠仍然由方块 1 和 2 组成,堆叠的最高高度为 5 。
因此,返回 [2, 5, 5] 作为答案。
示例 2:

输入:positions = [[100,100],[200,100]]
输出:[100,100]
解释:
第 1 个方块掉落后,最高的堆叠由方块 1 组成,堆叠的最高高度为 100 。
第 2 个方块掉落后,最高的堆叠可以由方块 1 组成也可以由方块 2 组成,堆叠的最高高度为 100 。
因此,返回 [100, 100] 作为答案。
注意,方块 2 擦过方块 1 的右侧边,但不会算作在方块 1 上着陆。

提示:

1 <= positions.length <= 1000
1 <= lefti <= 108
1 <= sideLengthi <= 106

思路:可以用暴力枚举的方法,每个方块落地时,如果没有和之前的方块区间有重叠,最后的高度就是方块的高度,如果有重叠,最后高度就是方块高度+下面方块的高度,如果与多个方块重叠,就取最大高度值。所以整个过程就是遍历所有方块,对每一个方块,再遍历之前确定高度的方块,从而确定当前方块的高度,一共两层循环。因为最后要返回的是最大高度数组,所以还要遍历一次结果列表,每次两两比较取最大高度

class Solution {
    public List<Integer> fallingSquares(int[][] positions) {
        List<Integer> res = new ArrayList<>();
        for(int i = 0; i < positions.length; i++){
            int l1 = positions[i][0], r1 = positions[i][0] + positions[i][1];
            int h = positions[i][1];
            for(int j = 0; j < i; j++){
                int l2 = positions[j][0],r2  = positions[j][0] + positions[j][1];
                if(r1 > l2 && r2 > l1){//区间重叠
                    h = Math.max(h,res.get(j) + positions[i][1]);
                }
            }
            res.add(h);
        }
        for(int i = 1; i < positions.length; i++){
            res.set(i, Math.max(res.get(i), res.get(i-1))); //取最大高度
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值