【每日一题】Day0003:力扣题库NO.807. 保持城市天际线

题目名字挺酷,颇有一种未来感。

链接如下:

力扣https://leetcode-cn.com/problems/max-increase-to-keep-city-skyline/废话不多说,直接记录思路:

1. 前提grid的'宽'和'高'一定在2到50内,且两者相等,所以问题简单很多,且不用考虑一些极端情况。

2. 遍历grid找出竖直方向和水平方向上的天际线

3. 遍历grid每个元素与元素所处行列的天际线较小者比较,其差之和即为结果

代码如下:

package cn.daycode.leetcode;

public class MaxIncreaseKeepingSkyline {
    public static void main(String[] args) {
        int[][] gird = {{3,0,8,4},{2,4,5,7},{9,2,6,3},{0,3,1,0}};
        System.out.println(maxIncreaseKeepingSkyline(gird));
    }

    public static int maxIncreaseKeepingSkyline(int[][] grid) {
        int[][] skyLine = findSkyline(grid);
        int sum = 0;

        // 遍历grid,每个元素与对应的skyLine天际线比较差值并求和
        for(int i=0; i<grid.length; i++){
            for (int j=0; j<grid.length; j++){
                int top = skyLine[0][j]>skyLine[1][i]?skyLine[1][i]:skyLine[0][j];
                sum = sum + top - grid[i][j];
            }
        }

        return sum;
    }

    // 该函数找到grid的天际线并以二维数组形式返回。
    public static int[][] findSkyline(int [][] grid){
        int[][] skyLine = new int[2][grid.length];

        // 找天际线,存放到skyLine
        for(int i=0; i< grid.length; i++){
            int tempVMax = grid[0][i]; // 用于临时存放竖直方向最大值
            int tempHMax = grid[i][0]; // 用于临时存放水平方向最大值
            for(int j=0; j < grid.length; j++){
                if(grid[j][i] > tempVMax){
                    tempVMax = grid[j][i];
                }
                if(grid[i][j] > tempHMax){
                    tempHMax = grid[i][j];
                }
            }
            skyLine[0][i] = tempVMax; // 竖直方向天际线
            skyLine[1][i] = tempHMax; // 水平方向天际线
        }

        return skyLine;
    }
}

 一共遍历两次grid,不知可否减少循环次数。感觉题目再简化设定后,可以作为编程学习期间的循环嵌套思考题~

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值