A row-sorted binary matrix means that all elements are 0 or 1 and each row of the matrix is sorted in non-decreasing order.
Given a row-sorted binary matrix binaryMatrix, return the index (0-indexed) of the leftmost column with a 1 in it. If such an index does not exist, return -1.
You can’t access the Binary Matrix directly. You may only access the matrix using a BinaryMatrix interface:
Submissions making more than 1000 calls to BinaryMatrix.get will be judged Wrong Answer. Also, any solutions that attempt to circumvent the judge will result in disqualification.
For custom testing purposes, the input will be the entire binary matrix mat. You will not have access to the binary matrix directly.
Example 1:
Input: mat = [[0,0],[1,1]]
Output: 0
Example 2:
Input: mat = [[0,0],[0,1]]
Output: 1
Example 3:
Input: mat = [[0,0],[0,0]]
Output: -1
Constraints:
rows == mat.length
cols == mat[i].length
1 <= rows, cols <= 100
mat[i][j] is either 0 or 1.
mat[i] is sorted in non-decreasing order.
For each row, do a binary search, and update the leftmost column index.
Time complexity:
o
(
log
n
∗
m
)
o(\log n * m)
o(logn∗m)
Space complexity:
o
(
1
)
o(1)
o(1)
Solved after hints.
Start from top right, if the current number is 0
, go down. Otherwise go left.
Time complexity:
o
(
m
+
n
)
o(m+n)
o(m+n)
Space complexity:
o
(
1
)
o(1)
o(1)
# """
# This is BinaryMatrix's API interface.
# You should not implement it, or speculate about its implementation
# """
#class BinaryMatrix(object):
# def get(self, row: int, col: int) -> int:
# def dimensions(self) -> list[]:
class Solution:
def leftMostColumnWithOne(self, binaryMatrix: 'BinaryMatrix') -> int:
rows, cols = binaryMatrix.dimensions()
def find_index(row: int) -> int:
left, right = 0, cols - 1
while left < right:
mid = (left + right) >> 1
if binaryMatrix.get(row, mid) == 0:
left = mid + 1
else:
right = mid
return (left + right) >> 1
res = -1
for i in range(rows):
col_index = find_index(i)
if binaryMatrix.get(i, col_index) == 1:
res = min(res, col_index) if res != -1 else col_index
return res
# """
# This is BinaryMatrix's API interface.
# You should not implement it, or speculate about its implementation
# """
#class BinaryMatrix(object):
# def get(self, row: int, col: int) -> int:
# def dimensions(self) -> list[]:
class Solution:
def leftMostColumnWithOne(self, binaryMatrix: 'BinaryMatrix') -> int:
rows, cols = binaryMatrix.dimensions()
cur_row, cur_col = 0, cols - 1
res = cols
while cur_row < rows and cur_col >= 0:
if binaryMatrix.get(cur_row, cur_col) == 1:
res = min(res, cur_col)
cur_col -= 1
else:
cur_row += 1
return res if res != cols else -1