📅  最后修改于: 2023-12-03 15:23:33.194000             🧑  作者: Mango
给定一个按行排序的二进制矩阵,其中每一行都可以被视为一个二进制数。请找到包含至少一个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
这个二维数组本身含有排序性,不妨考虑将其转化为一维数组。对于某一个位置 $(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