首页 > 其他分享 >699. 掉落的方块 Hard

699. 掉落的方块 Hard

时间:2024-07-28 17:24:11浏览次数:9  
标签:Hard 699 高度 site 堆叠 坐标 position 方块

在二维平面上的 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

题目大意:计算每个方块着陆后所有方块堆叠的最大高度。

分析:

(1)可以用数组height[i]记录坐标i上的方块的最高高度。则放置一个新方块position[i],只需将坐标position[i][0]到坐标(position[i][0]+position[i][1]-1)中所有坐标的高度全置为这些坐标中的最大高度+position[i][1],在遍历方块的过程中再维护所有方块的最高高度即可得出每个方块着陆后所有方块堆叠的最大高度;

(2)由于题目中坐标的个数较多,用height数组记录所有坐标的高度时间复杂度和空间复杂度较大,但记录所有坐标的高度是冗余的,只需记录每个方块的起始坐标position[i][0]和终止坐标(position[i][0]+position[i][1]-1)上的高度即可;

(3)根据(2)再开辟一个数组site[i]记录每个方块的起始位置和终止位置,并对site数组排序和去重,height[i]便用于记录坐标site[i]的高度。为更新坐标position[i][0]到坐标(position[i][0]+position[i][1]-1)中所有坐标的高度,只需在site中用二分查找position[i][0]的下标k,然后从height[k]开始往后更新到height[p],其中site[p]=position[i][0]+position[i][1]-1。

class Solution {
public:
    int findSite(vector<int>& site,int M,int tar){
        int l=0,r=M-1,mid;
        while(l<=r){
            mid=(l+r)/2;
            if(site[mid]==tar) return mid;
            else if(site[mid]>tar) r=mid-1;
            else l=mid+1;
        }
        return -1;
    }
    vector<int> fallingSquares(vector<vector<int>>& positions) {
        int N=positions.size(),maxH=0;
        vector<int> site;
        site.reserve(2*N);
        for(const auto& v:positions){
            site.emplace_back(v[0]);
            site.emplace_back(v[0]+v[1]-1);
        }
        sort(site.begin(),site.end());
        site.erase(unique(site.begin(),site.end()),site.end());
        int M=site.size();
        vector<int> height(M,0),ans(N);
        for(int i=0,start,end,len,tmp;i<N;++i){
            len=positions[i][1];
            start=findSite(site,M,positions[i][0]);
            end=positions[i][0]+len-1;
            tmp=0;
            for(int j=start;j<M&&site[j]<=end;++j) tmp=max(tmp,height[j]);
            tmp+=len;
            for(int j=start;j<M&&site[j]<=end;++j) height[j]=tmp;
            maxH=max(tmp,maxH);
            ans[i]=maxH;
        }
        return ans;
    }
};

标签:Hard,699,高度,site,堆叠,坐标,position,方块
From: https://blog.csdn.net/m0_60444839/article/details/140751784

相关文章

  • 【教学类-70-02】20240724立体拼图(9方块6图)-N套测试(蝴蝶)
       背景需求前期做了一个蝴蝶的六面图【教学类-70-01】20240724立体拼图(9方块6图)-1套测试(蝴蝶)-CSDN博客文章浏览阅读279次,点赞11次,收藏2次。【教学类-70-01】20240724立体拼图(9方块6图)-1套测试(蝴蝶)https://blog.csdn.net/reasonsummer/article/details/140669551这次......
  • [题解]CF958C3 Encryption (hard)
    思路先考虑\(\Theta(n^2k)\)的暴力DP。定义\(dp_{i,j}\)表示在前\(i\)个数中选取\(j\)个的最小和,转移显然:\[dp_{i,j}=\min_{1\leqk<i}\{dp_{k,j-1}+s_{k+1,i}\bmodp\}\]注意到一个性质:\(dp_{i,j}\equivs_i\pmodp\)。因为前者是前\(i\)项分为若干......
  • shardingjdbc 使用记录
    注意几个概念:数据源,数据源别名(shardingjdbc的配置会给每个数据源配置别名)db实例(物理概念),逻辑库如果db实例是同一个的话,那么可以只配置一个数据源,通过shardingjdbc的路由策略来路由到具体的逻辑库。这样可以降低db的连接数。  配置了hint的路由策略,但是没有生效,断点......
  • SpringBoot+ Sharding Sphere 轻松实现数据库字段加解密
    一、介绍在实际的软件系统开发过程中,由于业务的需求,在代码层面实现数据的脱敏还是远远不够的,往往还需要在数据库层面针对某些关键性的敏感信息,例如:身份证号、银行卡号、手机号、工资等信息进行加密存储,实现真正意义的数据混淆脱敏,以满足信息安全的需要。那在实际的业务开发过程......
  • 如何在 MacOS 上生成跟随鼠标的绿色方块?
    我正在尝试编写一个python应用程序,它生成一个没有填充的绿色方块,跟随我的光标。我希望这个正方形始终可见,所以用CSS术语来说,我希望它的z-index最大。我想实现这一点的方法是:首先实现一个不断检索我的光标位置的重复方法。在它旁边生成一个绿色方块。......
  • C2. Bessie's Birthday Cake (Hard Version)
    原题链接题解假如\(y=1\)该如何添加?然后逐步推导code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;inta[200005];boolcmp(intx,inty){if(x%2!=y%2)returnx%2<y%2;elsereturnx<y;}voidsolve(){intn,x,y;cin&g......
  • 俄罗斯方块游戏的算法实现
    已经实现的功能有:地图功能方块向左向右向下移动方块旋转90、180、270、360向下移动到底了未实现的:向下移动到底,判断是否消除行随机添加新的方块游戏结束 functionBinaryBlockGame(width=10,height=10){this.role=nullthis.roleMap=nullthis.data=ne......
  • D2. Sum over all Substrings (Hard Version)
    原题链接题解code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;lldp[1000005]={0};voidsolve(){lln,ans=0;cin>>n;strings;cin>>s;s=""+s;//使字符串1索引化for(lli=1......
  • Sharding-JDBC
    一、概念:        Sharding-JDBC是一个在客户端的分库分表工具。它是一个轻量级Java框架,在Java的JDBC层提供的额外服务。        ShardingSphere提供标准化的数据分片、分布式事务和数据治理功能。二、架构图:ShardingRuleConfiguration可以包含多个Tabl......
  • What Makes Quantization for Large Language Models Hard?
    本文是LLM系列文章,针对《WhatMakesQuantizationforLargeLanguageModelsHard?AnEmpiricalStudyfromtheLensofPerturbation》的翻译。是什么让大型语言模型的量化变得困难?微扰透镜的经验研究摘要1引言2相关工作3前言4从微扰的角度看LLM量子化5......