2021.12.13LeetCode每日一题——保持城市天际线

该博客讨论了一个二维数组问题,其中目标是在不改变城市天际线的情况下最大化建筑物高度的增加。文章通过遍历矩阵找出每一行和每一列的最大值,并在不影响天际线的前提下计算可以增加的总高度。提供的解决方案中,使用了两个数组分别存储行和列的最大值,然后计算每个单元格可以增加的高度。最后,返回所有单元格增加高度的总和。
摘要由CSDN通过智能技术生成

目录

保持城市天际线

描述

示例

说明

方法:遍历


保持城市天际线

描述

在二维数组grid中,grid[i][j]代表位于某处的建筑物的高度

我们被允许增加任何数量(不同建筑物的数量可能不同)的建筑物的高度。 高度 0 也被认为是建筑物。

最后,从新数组的所有四个方向(即顶部,底部,左侧和右侧)观看的“天际线”必须与原始数组的天际线相同。

城市的天际线是从远处观看时,由所有建筑物形成的矩形的外部轮廓。 请看下面的例子。

建筑物高度可以增加的最大总和是多少?

示例

输入: grid = [[3,0,8,4],[2,4,5,7],[9,2,6,3],[0,3,1,0]]

输出: 35

解释:
The grid is:
[ [3, 0, 8, 4], 
  [2, 4, 5, 7],
  [9, 2, 6, 3],
  [0, 3, 1, 0] ]

从数组竖直方向(即顶部,底部)看“天际线”是:[9, 4, 8, 7]
从水平水平方向(即左侧,右侧)看“天际线”是:[8, 7, 9, 3]

在不影响天际线的情况下对建筑物进行增高后,新数组如下:

gridNew = [ [8, 4, 8, 7],
            [7, 4, 7, 7],
            [9, 4, 8, 7],
            [3, 3, 3, 3] ]

说明

  • 1 < grid.length = grid[0].length \le 50
  • grid[i][j] 的高度范围是: [0, 100]
  • 一座建筑物占据一个grid[i][j]:换言之,它们是 1 \times 1 \times grid[i][j] 的长方体。

方法:遍历

遍历找到每行每列的最大值,然后进行增高时,取当前列当前行的最大值中的较小的那个,保持天界线。

class Solution {
    public int maxIncreaseKeepingSkyline(int[][] grid) {
        int[] row=new int[grid.length];//存储每一行的最大值
        int[] col=new int[grid[0].length];//存储每一列的最大值
        for (int i = 0; i < grid.length; i++){
            int max=grid[i][0];
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j]>max) max=grid[i][j];
            }
            row[i]=max;//记录当前行的最大值
        }
        for (int i = 0; i < grid[0].length; i++){
            int max=grid[0][i];
            for (int j = 0; j < grid.length; j++) {
                if (grid[j][i]>max) max=grid[j][i];
            }
            col[i]=max;//记录当前列的最大值
        }

        int height=0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                height+=Math.min(row[i],col[j])-grid[i][j];//取较小值进行增高
            }
        }
        return height;
    }
}

参考资源链接:[C++解决LeetCode第86题:分隔链表题解](https://wenku.csdn.net/doc/2v3shkrvm5?utm_source=wenku_answer2doc_content) 在解决LeetCode第86题——分隔链表的过程中,掌握C++语言和链表操作是关键。为了帮助你更好地理解并实现这一题目的解决方案,特别推荐《C++解决LeetCode第86题:分隔链表题解》这份资源。通过这份资料,你可以获得关于本题题解的详细解析和代码实现,直接应对当前的编程挑战。 分隔链表题要求将链表中所有小于给定值x的节点移动到所有大于等于x的节点之前,同时保持原有节点的相对顺序。以下是使用C++实现的步骤和代码示例: 1. 创建两个虚拟头节点,分别为small和large,这有助于处理边界条件,简化链表的插入操作。 2. 遍历原始链表,根据节点值与x的比较结果,将节点分别插入到small和large链表中。 3. 将small链表的最后一个节点连接到large链表的第一个节点,完成链表的分隔。 4. 返回small链表的头节点作为最终链表的头节点。 以下是C++代码实现: ```cpp // 定义链表节点结构 struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(nullptr) {} }; // 分隔链表函数实现 ListNode* partition(ListNode* head, int x) { ListNode dummySmall(0), dummyLarge(0); ListNode *small = &dummySmall, *large = &dummyLarge; while (head) { if (head->val < x) { small = small->next = head; } else { large = large->next = head; } head = head->next; } small->next = dummyLarge.next; large->next = nullptr; return dummySmall.next; } ``` 在掌握上述分隔链表的解法后,建议进一步深入学习链表操作的各种技巧,包括反转链表、合并链表、检测环等,这将对提升你的数据结构和算法水平大有裨益。为了继续扩展你的知识,不妨探索更多类似的C++题解和算法实践资源,这会加深你对LeetCode平台以及编程面试准备的理解。 参考资源链接:[C++解决LeetCode第86题:分隔链表题解](https://wenku.csdn.net/doc/2v3shkrvm5?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值