力扣554(java&python)-砖墙(中等)
题目:
你的面前有一堵矩形的、由 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
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/brick-wall
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
参考题解:@【97wglL4】
哈希表+前缀和:题目要求的是要求穿过的砖块数量最少,那么可以等效的求穿过的空隙最多。使用哈希表统计每个空隙出现的次数,然后统计出现次数最多的间隙,最终用砖块的总行数减去最大空隙数即为穿过的最小砖块数。
例如示例1:
输入:wall = [[1,2,2,1],[3,1,2],[1,3,2],[2,4],[3,1,2],[1,3,1,1]]
输出:2

根据上面砖块平铺的示意图,间隙数就是每个砖块的右边界【不能计算最后一块砖的右边界】,而每个砖块的右边界等价于求每块砖的前缀和,所以用一个变量sum去维护每一行的前缀和,然后再用一个map做统计就可以了。
注意:x = 0和右边缘不能算。
- 第一行的间隙数[1,3,5]
- 第二行的间隙数[3,4]
- 第三行的间隙数[1,4]
- 第四行的间隙数[2]
- 第五行的间隙数[3,4]
- 第六行的间隙数[1,4,5]
出现间隙数最多的是4,用总行6 - 4 = 2。
java代码:
1 class Solution {
2 public int leastBricks(List<List<Integer>> wall) {
3 Map<Integer, Integer> map = new HashMap<>();
4 int maxcount = 0;
5 for(List<Integer> list : wall){
6 int sum = 0;
7 int n = list.size();
8 for(int i = 0; i < n-1; i++){
9 sum += list.get(i);
10 int count = map.getOrDefault(sum, 0) + 1;
11 map.put(sum, count);
12 maxcount = Math.max(maxcount, count);
13 }
14 }
15 return wall.size() - maxcount;
16
17 }
18 }

python3代码:
1 class Solution:
2 def leastBricks(self, wall: List[List[int]]) -> int:
3 map = collections.defaultdict(int)
4 for line in wall:
5 sum = 0
6 for i in line[:-1]:
7 sum += i
8 map[sum] += 1
9 # 如果map为空,wall = [[1],[1],[1]]则每块砖都穿过
10 if not map:
11 return len(wall)
12 return len(wall) - max(map.values(), default = 0)

小知识:
1.python中切片:假设str = '012345678'
str[:-1]:正向输出,从开始到倒数第一个字符(不含这倒数第一个) # 01234567
2.在使用 python 自带的字典 dict() 时常会碰到比较麻烦的地方, 譬如当 ‘key1’ 不存在时, 使用 map[key1] 会导致 KeyError. 因此引入 collections.defaultdict():
这里面的参数可以选择int,dict,set, list, str,将规定 defaultdict 中 value 的默认数值类型, 也就是说,当 ‘key1’ 不存在时, map[key1] 将会返回对应的空值 (int: 0, dict: {}, list: ())。
3.java中getOrDefault()方法:getOrDefault(key, default)如果存在key, 则返回其对应的value, 否则返回给定的默认值
eg:map.getOrDefault(s1.charAt(i), 0) + 1); 若没有s1中的字符就是0, 若有s1中的字符就是在原有值上+1
力扣554(java&python)-砖墙(中等)的更多相关文章
- LeetCode(力扣)——Search in Rotated Sorted Array2 搜索旋转排序数组 python实现
题目描述: python实现 Search in Rotated Sorted Array2 搜索旋转排序数组 中文: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0 ...
- LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现
题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组 中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ...
- 力扣—Reorder List(重排链表)python实现
题目描述: 中文: 给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点 ...
- 力扣 ——Linked List Cycle II(环形链表 II) python实现
题目描述: 中文: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). ...
- 力扣——Linked List Cycle(环形链表) python实现
题目描述: 中文: 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. ...
- 力扣——Copy List with Random Pointer(复制带随机指针的链表) python实现
题目描述: 中文: 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深拷贝. 示例: 输入:{"$id":" ...
- 力扣——Reverse Nodes in k-Group(K 个一组翻转链表) python实现
题目描述: 中文: 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序 ...
- 力扣—— Swap Nodes in Pairs(两两交换链表中的节点) python实现
题目描述: 中文: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4, ...
- 力扣—Remove Nth Node From End of List(删除链表的倒数第N个节点) python实现
题目描述: 中文: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二 ...
- 力扣 ——Remove Duplicates from Sorted List II(删除排序链表中的重复元素 II)python实现
题目描述: 中文: 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4->4-> ...
随机推荐
- Android Studio导出APP的数据库db文件
原文地址:Android Studio导出APP的数据库db文件 | Stars-One的杂货小窝 最近项目开发需要使用到Android内置的Sqlite存数据,但是公司里没有对应的调试环境,只能让现 ...
- 对角矩阵try
\begin{bmatrix}1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1\end{bmatrix}
- 记录--纯CSS实现骚气红丝带
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在本文中,我们将探讨如何使用 CSS 以最少的代码创造出精美的 CSS 丝带形状,并最终实现下面这个效果: 下面我们使用html和css来 ...
- TP6框架--EasyAdmin学习笔记:定义路由
这是我写的学习EasyAdmin的第二章,这一章我给大家分享下如何定义一条路由 正常的tp6定义路由方法如下: /route/admins/app.php 文件内容 //路由变量自定义 Route:: ...
- 使用SpringBatch读取csv文件
目录 1.需求 2.解决方案 3.注意事项 1.文件路径的获取 2.各个Step如果获取到ExecutionContext中的值 3.FlatFileItemReader使用注意 4.实现步骤 1.导 ...
- 2024 OI/VEX/啊啊啊? 赛季游记
不定期更新,随便写. 中马建交80周年 CreateJR赛项 什么远古比赛,2024/01 的时间用 2023 赛季的规则(挺好). Day -4 1/24 在 破败不堪 的上海市安生学校集训. 点的 ...
- 为什么js项目中金额强烈推荐使用分而不是元
相信我们都已经知道在js中浮点数据精度的问题了 看下面的例子 0.1 + 0.2 0.30000000000000004 如何解决呢? 在前后端交互过程中统一使用分为单位进行通讯,在最后的表示层处理为 ...
- Apache服务器打开网页是乱码解决方案
当 Apache 服务器显示乱码时,可以使用两种方法解决: 1. 服务器端 可以在 Apache 的配置文件中添加以下内容来设置默认编码为UTF-8: AddDefaultCharset utf-8 ...
- Cesium 根据飞机航线计算飞机的Heading(偏航角)、Pitch(俯仰角)、Roll(翻滚角)
需求 设置飞机的一些坐标位置(经纬度高度),插值得到更多的坐标位置,然后飞机按照这些坐标集合形成的航线飞行,飞机的朝向.俯仰角以及飞机转弯时的翻转角根据坐标集合计算得出,而不需要手动设置heading ...
- S锁,X锁,乐观锁和悲观锁
S锁:S锁也叫共享锁,读锁,数据只能被读取不能被修改. X锁:X锁也叫排他锁,写锁,一个事务对表加锁后,其他事务就不能对其进行加锁与增删查改操作. 乐观锁:总是假设是最好的情况,每次去操作的时候都不会 ...