力扣3531——统计被覆盖的建筑

题目

给你一个正整数 n,表示一个 n x n 的城市,同时给定一个二维数组 buildings,其中 buildings[i] = [x, y] 表示位于坐标 [x, y] 的一个 唯一 建筑。

如果一个建筑在四个方向(左、右、上、下)中每个方向上都至少存在一个建筑,则称该建筑 被覆盖 。

返回 被覆盖 的建筑数量。

示例

示例 1:

输入: n = 3, buildings = [[1,2],[2,2],[3,2],[2,1],[2,3]]

输出: 1

解释: 只有建筑[2,2] 被覆盖,因为它在每个方向上都至少存在一个建筑:

上方 ([1,2])

下方 ([3,2])

左方 ([2,1])

右方([2,3])

因此,被覆盖的建筑数量是 1。

示例 2:

输入: n = 3, buildings = [[1,1],[1,2],[2,1],[2,2]]

输出: 0

解释:

没有任何一个建筑在每个方向上都有至少一个建筑。

示例 3:

输入: n = 5, buildings = [[1,3],[3,2],[3,3],[3,5],[5,3]]

输出: 1

解释: 只有建筑[3,3] 被覆盖,因为它在每个方向上至少存在一个建筑:

上方 ([1,3])

下方 ([5,3])

左方 ([3,2])

右方([3,5])

因此,被覆盖的建筑数量是 1。

提示:

2 <= n <= 105

1 <= buildings.length <= 105

buildings[i] = [x, y]

1 <= x, y <= n

buildings 中所有坐标均 唯一 。

思路:

定义两个横纵方向的哈希数组,分别计算两个方向每个坐标的最大值和最小值,如果building[i]在该范围内,则该建筑被覆盖

例如对于坐标

{1,3},{3,2},{3,3},{3,5},{5,3}

初始化mapRow为

{0,[Integer.MAX_VALUE,Integer.MIN_VALUE]} //表示第0行的最小值和最大值

{1,[Integer.MAX_VALUE,Integer.MIN_VALUE]}

{2,[Integer.MAX_VALUE,Integer.MIN_VALUE]}

{3,[Integer.MAX_VALUE,Integer.MIN_VALUE]}

{4,[Integer.MAX_VALUE,Integer.MIN_VALUE]}

{5,[Integer.MAX_VALUE,Integer.MIN_VALUE]}

初始化mapCol为

{0,[Integer.MAX_VALUE,Integer.MIN_VALUE]} //表示第0列的最小值和最大值

{1,[Integer.MAX_VALUE,Integer.MIN_VALUE]}

{2,[Integer.MAX_VALUE,Integer.MIN_VALUE]}

{3,[Integer.MAX_VALUE,Integer.MIN_VALUE]}

{4,[Integer.MAX_VALUE,Integer.MIN_VALUE]}

{5,[Integer.MAX_VALUE,Integer.MIN_VALUE]}

对于数字{1,3}修改mapRow为

{0,[Integer.MAX_VALUE,Integer.MIN_VALUE]} //表示第0行的最小值和最大值

{1,[Integer.MAX_VALUE,Integer.MIN_VALUE]}

{2,[Integer.MAX_VALUE,Integer.MIN_VALUE]}

{3,[1,1]}. //表示第3行的最小值和最大值分别是(1,1)

{4,[Integer.MAX_VALUE,Integer.MIN_VALUE]}

{5,[Integer.MAX_VALUE,Integer.MIN_VALUE]}

修改mapCol为

{0,[Integer.MAX_VALUE,Integer.MIN_VALUE]} //表示第0行的最小值和最大值

{1,[3,3]} //表示第1列的最小值和最大值分别是(3,3)

{2,[Integer.MAX_VALUE,Integer.MIN_VALUE]}

{3,[Integer.MAX_VALUE,Integer.MIN_VALUE]}.

{4,[Integer.MAX_VALUE,Integer.MIN_VALUE]}

{5,[Integer.MAX_VALUE,Integer.MIN_VALUE]}


最后的mapRow为

最后的mapCol为

代码

java 复制代码
    public static int countCoveredBuildings(int n, int[][] buildings) {
        HashMap<Integer, int[]> mapRow = new HashMap<>();//第i行的最大值和最小值
        HashMap<Integer, int[]> mapCol = new HashMap<>();//第i列的最大值和最小值
        for(int i = 0; i < n + 1;i++){
            mapRow.put(i, new int[]{Integer.MAX_VALUE,Integer.MIN_VALUE});
            mapCol.put(i, new int[]{Integer.MAX_VALUE,Integer.MIN_VALUE});
        }
        int result = 0;
        for(int[] building : buildings){
            if(building[0]>mapRow.get(building[1])[1])
                mapRow.put(building[1],new int[]{mapRow.get(building[1])[0],building[0]});
            if(building[0]<mapRow.get(building[1])[0])
                mapRow.put(building[1],new int[]{building[0],mapRow.get(building[1])[1]});
            if(building[1]>mapCol.get(building[0])[1])
                mapCol.put(building[0],new int[]{mapCol.get(building[0])[0],building[1]});
            if(building[1]<mapCol.get(building[0])[0])
                mapCol.put(building[0],new int[]{building[1],mapCol.get(building[0])[1]});
        }
        for(int[] building : buildings){
            if(building[0] < mapRow.get(building[1])[1] && building[0] > mapRow.get(building[1])[0] && building[1] < mapCol.get(building[0])[1] && building[1] > mapCol.get(building[0])[0]){
                result += 1;
            }
        }
        return result;
    }
相关推荐
啊阿狸不会拉杆11 分钟前
《机器学习导论》第 5 章-多元方法
人工智能·python·算法·机器学习·numpy·matplotlib·多元方法
R1nG8631 小时前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann
_OP_CHEN1 小时前
【算法基础篇】(五十六)容斥原理指南:从集合计数到算法实战,解决组合数学的 “重叠难题”!
算法·蓝桥杯·c/c++·组合数学·容斥原理·算法竞赛·acm/icpc
TracyCoder1231 小时前
LeetCode Hot100(27/100)——94. 二叉树的中序遍历
算法·leetcode
九.九1 小时前
CANN HCOMM 底层机制深度解析:集合通信算法实现、RoCE 网络协议栈优化与多级同步原语
网络·网络协议·算法
C++ 老炮儿的技术栈2 小时前
Qt Creator中不写代如何设置 QLabel的颜色
c语言·开发语言·c++·qt·算法
子春一2 小时前
Flutter for OpenHarmony:构建一个 Flutter 数字消消乐游戏,深入解析网格状态管理、合并算法与重力系统
算法·flutter·游戏
草履虫建模8 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq10 小时前
分布式系统安全通信
开发语言·c++·算法
Jasmine_llq10 小时前
《P3157 [CQOI2011] 动态逆序对》
算法·cdq 分治·动态问题静态化+双向偏序统计·树状数组(高效统计元素大小关系·排序算法(预处理偏序和时间戳)·前缀和(合并单个贡献为总逆序对·动态问题静态化