📌  相关文章
📜  在按行排序的二进制矩阵中至少有一个 1 的最左边的列 | 2套(1)

📅  最后修改于: 2023-12-03 15:23:33.194000             🧑  作者: Mango

在按行排序的二进制矩阵中至少有一个 1 的最左边的列 | 2套

题目描述

给定一个按行排序的二进制矩阵,其中每一行都可以被视为一个二进制数。请找到包含至少一个1的最左边的列。

返回最左边的包含 1 的列的索引,如果不存在这样的列,返回 -1。

二维矩阵的每一个元素为整数,且值只有 0 或 1。

示例 1:

输入:matrix = [[0,0,0,1],[0,0,1,1],[0,1,1,1]]
输出:1

示例 2:

输入:matrix = [[0,0],[1,1]]
输出:0
方法一
思路

对于每一行,找到最左侧的 1 的位置,然后更新最左侧的 1 的位置。如果没有找到 1,那么就跳过该行。

代码实现
class Solution:
    def leftMostColumnWithOne(self, binaryMatrix: 'BinaryMatrix') -> int:
        m, n = binaryMatrix.dim()
        ans = float('inf')
        for i in range(m):
            l, r = 0, n - 1
            while l < r:
                mid = l + r >> 1
                if binaryMatrix.get(i, mid) == 0:
                    l = mid + 1
                else:
                    r = mid
            if binaryMatrix.get(i, l) == 1:
                ans = min(ans, l)
        return ans if ans < float('inf') else -1
复杂度分析
  • 时间复杂度:$O(m \log_2 n)$
  • 空间复杂度:$O(1)$
方法二
思路

这个二维数组本身含有排序性,不妨考虑将其转化为一维数组。对于某一个位置 $(i,j)$,可以转化为 $n \times i + j$。

最后遍历这个一维数组,对于某一个位置 $k$,其对应的坐标为 $(k \ // \ n, k \ % \ n)$。只要从前往后找到第一个 1,那么其对应的列即为所求的结果。

代码实现
class Solution:
    def leftMostColumnWithOne(self, binaryMatrix: 'BinaryMatrix') -> int:
        m, n = binaryMatrix.dim()
        ans = float('inf')
        for k in range(m * n):
            i, j = divmod(k, n)
            if binaryMatrix.get(i, j) == 1:
                ans = min(ans, j)
        return ans if ans < float('inf') else -1
复杂度分析
  • 时间复杂度:$O(mn)$
  • 空间复杂度:$O(1)$
参考文献