ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

砖墙(HashMap)

2021-05-02 11:32:48  阅读:257  来源: 互联网

标签:map HashMap wall 缝隙 int 砖块 穿过 砖墙


554. 砖墙

你的面前有一堵矩形的、由 n 行砖块组成的砖墙。这些砖块高度相同(也就是一个单位高)但是宽度不同。每一行砖块的宽度之和应该相等。

你现在要画一条 自顶向下 的、穿过 最少 砖块的垂线。如果你画的线只是从砖块的边缘经过,就不算穿过这块砖。你不能沿着墙的两个垂直边缘之一画线,这样显然是没有穿过一块砖的。

给你一个二维数组 wall ,该数组包含这堵墙的相关信息。其中,wall[i] 是一个代表从左至右每块砖的宽度的数组。你需要找出怎样画才能使这条线 穿过的砖块数量最少 ,并且返回 穿过的砖块数量 。

示例 1:
在这里插入图片描述

输入:wall = [[1,2,2,1],[3,1,2],[1,3,2],[2,4],[3,1,2],[1,3,1,1]]
输出:2
示例 2:

输入:wall = [[1],[1],[1]]
输出:3

提示:

n == wall.length
1 <= n <= 104
1 <= wall[i].length <= 104
1 <= sum(wall[i].length) <= 2 * 104
对于每一行 i ,sum(wall[i]) 应当是相同的
1 <= wall[i][j] <= 231 - 1
通过次数22,105提交次数52,120

思路分析

我相信很多同学看题目似懂非懂,再加上示例看起来非常吓人的图,就感觉这道题很难,其实这种题目有很多,只是需要我们转换一下思路。

题目让我们求出穿过最少砖块的垂直线,什么是时候穿过最少?

  • 当穿过的缝隙越多,那说明穿过的砖块最少

我们以示例1为图:

在这里插入图片描述
首先我们假设黑色的线条为缝隙,那么我们假设:

  • 第一行的缝隙为[1,3,5]
  • 第二行的缝隙为[3,4]
  • 第三行的缝隙为[1,4]
  • 第四行的缝隙为[2]
  • 第五行的缝隙为[3,4]
  • 第六行的缝隙为[1,4,5]

之后我们将这先数据存在哈希表表中,缝隙值为key,每次遇到一样的缝隙值,value+1;

一个缝隙都不穿过,穿过的砖块即为砖块行数,即n,我们减去穿过最多缝隙数,即穿过最少砖块数。

java代码:

class Solution {
    public int leastBricks(List<List<Integer>> wall) {
        Map<Integer , Integer> map = new HashMap<Integer ,Integer>();
        int n = wall.size();
        //我们从第一行开始,一次记录
        for (int i = 0 ; i < n ; i++) {
            int sum = 0;
            //记录每一行每一个数字
            for (int curN : wall.get(i)) {
                //每次记录完一行一定要记得清零
                sum += curN;
                map.put(sum , map.getOrDefault(sum , 0) + 1); 
            }
            //最后一列不算,所以我们去掉
            map.remove(sum);
        }
        //我们在这里求得是穿过最多缝隙的垂直线,所以还有转换为题目要求的最少砖块
        int result = n;
        for (int key : map.keySet()) {
            int value = map.get(key);
            result = Math.min(result , n - value);
        }
        return result;
    }
}

或许有同学不知道keySet()这个方法是干什么的,就是获取key键的名称的方法,为什么说是名称呢,因为key不一定是数字,网上那些什么乱七八糟的说半天都说不明白什么意思,其实就这么简单,想要深入了解还得看源码。

当然迭代key值不仅仅只有这一种办法,我们还可以这样写:

for (Map.Entry<Integer,Integer> entry : map.entrySet()) {
   	result = Math.min(result , n - entry.getValue());
}

在这里插入图片描述

复杂度分析

时间复杂度

O(nm)
其中n为砖块行数,m为每行平均砖块数,你也可以说是某一行的最多砖块数,这不过是最坏情况

空间复杂度

O(nm)
每块转都会被扫描,所以还是mn

若有误,请指教!

标签:map,HashMap,wall,缝隙,int,砖块,穿过,砖墙
来源: https://blog.csdn.net/qq_43413774/article/details/116350172

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有