-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathleftmost-column-with-at-least-a-one.py
executable file
·149 lines (112 loc) · 3.8 KB
/
leftmost-column-with-at-least-a-one.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# -*- coding: utf-8 -*-
"""
Created on Tue Apr 21 14:21:12 2020
@author: johnoyegbite
"""
# SOLVED!
"""
Problem:
(This problem is an interactive problem.)
A binary matrix means that all elements are 0 or 1.
For each individual row of the matrix, this row is sorted in
non-decreasing order.
Given a row-sorted binary matrix binaryMatrix,
return leftmost column index(0-indexed) with at least a 1 in it.
If such index doesn't exist, return -1.
You can't access the Binary Matrix directly.
You may only access the matrix using a BinaryMatrix interface:
BinaryMatrix.get(x, y) returns the element of the matrix at index
(x, y) (0-indexed).
BinaryMatrix.dimensions() returns a list of 2 elements [n, m], which
means the matrix is n * m.
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 you're given the binary matrix mat as input
in the following four examples.
You will not have access the binary matrix directly.
The required column would be identified with " * " on it.
Example 1:
*
| 0 | 0 |
| 1 | 1 |
Input: mat = [[0,0],[1,1]]
Output: 0
Example 2:
*
| 0 | 0 |
| 0 | 1 |
Input: mat = [[0,0],[0,1]]
Output: 1
Example 3:
| 0 | 0 |
| 0 | 0 |
Input: mat = [[0,0],[0,0]]
Output: -1
Example 4:
*
| 0 | 0 | 0 | 1 |
| 0 | 0 | 1 | 1 |
| 0 | 1 | 1 | 1 |
Input: mat = [[0,0,0,1],[0,0,1,1],[0,1,1,1]]
Output: 1
Constraints:
1 <= mat.length, mat[i].length <= 100
mat[i][j] is either 0 or 1.
mat[i] is sorted in a non-decreasing way.
Hint:
1.
(Binary Search) For each row do a binary search to find the leftmost
one on that row and update the answer.
2.
(Optimal Approach) Imagine there is a pointer p(x, y) starting from top
right corner. p can only move left or down.
If the value at p is 0, move down. If the value at p is 1, move left.
Try to figure out the correctness and time complexity of this algorithm.
"""
# """
# This is BinaryMatrix's API interface.
# You should not implement it, or speculate about its implementation
# """
class BinaryMatrix(object):
def get(self, x: int, y: int) -> int:
pass
def dimensions(self) -> list[int]:
pass
class Solution:
def binarySearch(self, i: int, m: int, binaryMatrix) -> None:
start = 0
end = m
while start <= end:
mid = (start + end)//2
cell = binaryMatrix.get(i, mid) # to reduce no of API calls
if cell == 0:
start = mid + 1
elif cell == 1:
self.column = min(self.column, mid)
end = mid - 1
# def leftMostColumnWithOne(self, binaryMatrix: 'BinaryMatrix') -> int:
# """Hint 1 Solution"""
# n, m = binaryMatrix.dimensions()
# self.column = m
# for i in range(n):
# self.binarySearch(i, m-1, binaryMatrix)
# if self.column == m:
# return -1
# return self.column
def leftMostColumnWithOne(self, binaryMatrix: 'BinaryMatrix') -> int:
"""Hint 2 Solution"""
n, m = binaryMatrix.dimensions()
column_idx = m
x, y = [0, m-1]
while x < n and y >= 0:
cell = binaryMatrix.get(x, y)
if cell == 0:
x += 1
elif cell == 1:
column_idx = min(column_idx, y)
y -= 1
if column_idx == m:
return -1
return column_idx