2024.7.28力扣每日一题(笔记)

699.掉落的方块

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

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

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

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

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

思路:暴力枚举

  • 1.初始化一个空的 heights 列表来存储方块的高度。
  • 2.对于每个方块位置信息 positions[i]:
    计算当前方块的左边界 left1、右边界 right1和高度 height。
    遍历已经放置的方块(j = 0 到 i - 1):
    计算第 j 个方块的左边界 left2、右边界 right2。
    如果当前方块和之前的某个方块相交(即二者之间存在重叠部分):
    更新当前方块的高度为当前高度和之前方块高度加上当前方块的高度的最大值。
    将更新后的当前方块高度加入 heights 列表中。
  • 3.遍历 heights 列表,使用前一个方块的高度与当前方块的高度的最大值来更新每个方块的高度。
  • 4.返回最终的 heights 列表。

AC代码

class Solution {
    public List<Integer> fallingSquares(int[][] positions) {
        int n = positions.length;
        List<Integer> heights = new ArrayList<>();  // 创建一个空的列表 heights 来存储方块的高度
        for(int i=0;i<n;i++)
        {
            int left1 = positions[i][0], right1 = positions[i][0] + positions[i][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];  // 获取之前方块的左边界和右边界
                if(right1 > left2 && right2 > left1)  // 检查当前方块和之前方块是否有重叠
                {
                    // 更新当前方块的高度为当前高度和之前方块高度加上当前方块的高度的最大值
                    height = Math.max(height, heights.get(j) + positions[i][1]);
                }
            }
            heights.add(height);  // 将更新后的当前方块高度加入 heights 列表中
        }
        for(int i=1;i<n;i++)
        {
            // 使用前一个方块的高度与当前方块的高度的最大值来更新每个方块的高度
            heights.set(i, Math.max(heights.get(i), heights.get(i - 1)));
        }
        return heights; // 返回最终结果
    }
}
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值