554 砖墙【python3】

题目

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

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

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

代码&思路

对于给定的二维数组,行数是固定的。故任意画一条垂线(不包括两条沿着墙的边界线),垂线穿过的砖块数量与穿过的砖块间缝隙数量之和是固定的n,故只要找到穿过缝隙数量最多的垂线,就能找到穿过砖块数量最少的情况。
记录每一行的缝隙位置,并且用字典记录出现次数,之后遍历字典,找到出现次数最多的缝隙,其位置就是垂线下去的位置。
规定缝隙的位置为缝隙前的砖块长度和(不算边界)。例如[1,1]的缝隙位置为1,[1,2,2,1]的缝隙位置为1,3,5
若字典中没有记录数据,说明除了边界线,砖墙没有缝隙,无论如何都要穿过n块砖

class Solution:
    def leastBricks(self, wall: List[List[int]]) -> int:
        n=len(wall) # n行砖块
        D={} # 记录缝隙出现的次数
        for i in range(n):
            ind=0
            for w in wall[i][:-1]:
                if w+ind not in D:
                    D[w+ind]=1
                else:
                    D[w+ind]+=1
                ind+=w
        # 按照缝隙出现次数降序排列
        D1=sorted(D.items(),key=lambda x:x[1],reverse=True)
        print(D)

        if D!={}:
            return n-D1[0][1]
        else:
            return n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值