【LeetCode】85. 最大矩形(hard)(21届华为提前批面试手撕代码题)

相似题目:
【LeetCode】84. 柱状图中最大的矩形(单调栈).

1. 题目描述:

给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

示例:

输入:
[
[“1”,“0”,“1”,“0”,“0”],
[“1”,“0”,“1”,“1”,“1”],
[“1”,“1”,“1”,“1”,“1”],
[“1”,“0”,“0”,“1”,“0”]
]
输出: 6

2. 解题思路

2.1 法一、单调栈

具体可参考【LeetCode】84. 柱状图中最大的矩形(单调栈) 这一题目,代码都相似

class Solution:
    def maximalRectangle(self, matrix: List[List[str]]) -> int:
        if not matrix:
            return 0
        # 单调栈的应用 2
        def getLargestRectLayer(heights):
            ret = 0
            stack = []
            heights = [0] + heights + [0]
            for i in range(len(heights)):
                while stack and heights[stack[-1]] > heights[i]:
                    tmp = stack.pop()
                    ret = max(ret, (i - stack[-1] - 1) * heights[tmp])
                stack.append(i)
            return ret
        def getHeights(array, heights):
            for i in range(len(heights)):
                if array[i] == "1":
                    heights[i] += 1
                else:
                    heights[i]  = 0
            return heights
        # 对于每一层 获取heights数组即可
        ret = 0
        m = len(matrix)
        for i in range(m):
            if i == 0:
                heights = list(map(int, matrix[0]))
            else:
                heights = getHeights(matrix[i], heights)
            retLayer = getLargestRectLayer(heights)
            ret = max(ret, retLayer)
        return ret
2.2 法二、动态规划

面试的时候用的是动态规划,当时面试官就问说能不能用栈来解题

class Solution:
    def maximalRectangle(self, matrix: List[List[str]]) -> int:
        maxarea = 0

        dp = [[0] * len(matrix[0]) for _ in range(len(matrix))]
        for i in range(len(matrix)):
            for j in range(len(matrix[0])):
                if matrix[i][j] == '0': continue

                # compute the maximum width and update dp with it
                width = dp[i][j] = dp[i][j-1] + 1 if j else 1

                # compute the maximum area rectangle with a lower right corner at [i, j]
                for k in range(i, -1, -1):
                    width = min(width, dp[k][j])
                    maxarea = max(maxarea, width * (i-k+1))
        return maxarea

复杂度分析

  1. 时间复杂度 : O ( N 2 M ) O(N^2M) O(N2M) 。由于需要遍历同一列中的值,计算每个点对应最大面积需要 O ( N ) O(N) O(N)。对全部 N ∗ M N * M NM个点都要计算,因此总共 O ( N ) ∗ O ( N M ) = O ( N 2 M ) O(N) * O(NM) = O(N^2M) O(N)O(NM)=O(N2M).

  2. 空间复杂度 : O ( N M ) O(NM) O(NM)。我们分配了一个等大的数组,用于存储每个点的最大宽度。

参考

  1. LeetCode官方题解(动态规划).
  2. LeetCode题解(单调栈).
华为leetcode是指华为面试中要求候选人现场leetcode目。这种面试方式常用于评估候选人的编程能力和解决问的能力。 使用华为leetcode的优点是能够直接考察候选人的编程能力和思维逻辑。面试官可以根据候选人的解过程和代码实现来评估其算法和编程能力,从而更直观地了解候选人的能力水平。 使用这种面试方式还可以考察候选人在时间有限的情况下解决问的能力。编码要求候选人在短时间内完成编写算法和实现代码。这种情况下,候选人需要通过灵活运用算法知识、代码实现技巧和系统思考能力,快速找到解决问的方法。 然而,华为leetcode也存在一定的局限性。一方面,leetcode可能只考察候选人的算法和编程能力,而忽略了其他的技术要求,如系统设计、代码架构等。另一方面,由于目限定在leetcode库中,候选人可能通过事先刷来准备,从而提前得到目的答案,影响面试评估的公正性。 为了克服这些限制,华为还会在面试中结合其他的问和项目经验,综合评估候选人的整体能力。此外,华为还会要求候选人进行coding test,即在指定时间内以线上编码的方式解决问,更直观地了解候选人的编码能力。 总的来说,华为leetcode是一种评估候选人编程能力和解决问能力的有效方式,但也需要综合考虑其他方面的能力和筛选方法,以评估候选人的真实水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值