Number Negatives in Sorted Matrix
input:
t1 = [[-3, -2, -1, 1],
[-2, 2, 3, 4],
[4, 5, 7, 8]]
output:
4.-----------. <- b_search
-3, -2, -1, 1
.--------. <- b_search
-2, 2, 3, 4
.-. <- b_search
4, 5, 7, 8def b_search(ar, left, right):
"""
:param ar: List[int]
:param left: int
:param right: int
:return: int
"""
if left <= right:
mid = int(left + (right - left) / 2)
if ar[mid] >= 0 and mid - 1 >= 0 and ar[mid - 1] < 0:
return mid - 1
# checking the edges of the array
elif mid == right and ar[mid] < 0:
return right
# both are positive, so search left, otherwise search right
elif ar[mid] >= 0 and mid - 1 >= 0 and ar[mid - 1] >= 0:
return b_search(ar, left, mid - 1)
else:
return b_search(ar, mid + 1, right)
else:
return -1
def count_negatives(matrix):
"""
:param matrix: List[List[int]]
:return: int
"""
r = 0
c = len(matrix[0]) - 1
n_negs = 0
while r < len(matrix):
neg_i = b_search(matrix[r][:c + 1], 0, c)
if neg_i != -1:
n_negs += neg_i + 1
r += 1
c = neg_i
else:
return n_negs
return n_negs
t1 = [[-3, -2, -1, 1],
[-2, 2, 3, 4],
[4, 5, 7, 8]]
t2 = [[-3, -2, -1, -1],
[-2, -2, 3, 4],
[-1, 5, 7, 8]]
t3 = [[-1, -1, -1, -1, -1],
[-1, -1, -1, -1, -1],
[-1, -1, -1, -1, -1]]
t4 = [[]]
t5 = [[-4, -3, -1, -1]]
t6 = [[-1, -1, -1]]
t7 = [[-1]]
t8 = [[1, 2, 3, 4]]
t9 = [[1]]
print(count_negatives(t1))
print(count_negatives(t2))
print(count_negatives(t3))
print(count_negatives(t4))
print(count_negatives(t5))
print(count_negatives(t6))
print(count_negatives(t7))
print(count_negatives(t8))
print(count_negatives(t9))Last updated