該物件有兩個方法,一 get(),只能透過此方法去取得特定位置上的值。二 dimensions(),此方法會回傳列欄大小。
每列的值有經過排序(由小至大)。
如果呼叫 get() 超過1000次,也算失敗。
欄列的大小不超過100。
開始思考要如何找出目標值,除了每排有經過排序,但每欄並沒有提及。
因此除非知道每排最早出現 1 的位置,不然也暫時沒想到更好的方法。
get() 次數限制之下,每排要在 10 次內找出第一個 1 出現位置,最糟要在一百個已經排序的元素中搜查。
使用二分搜查法,50 > 25 > 13 > 7 > 4 > 2 > 1 ,最糟也能在七次內找到第一個 1 的位置。 萬一沒有,索引也會在等於欄數。這樣也能在限制內完成搜查。
Python
class Solution: def leftMostColumnWithOne(self, binaryMatrix: 'BinaryMatrix') -> int: rows, cols = binaryMatrix.dimensions() memo = [] for row in range(rows): l, r = 0 , cols while l < r: m = (r-l)//2 + l if binaryMatrix.get(row, m) == 0: l = m + 1 else: r = m memo.append(r) return min(memo) if min(memo) < rows else -1C#
class Solution { public int LeftMostColumnWithOne(BinaryMatrix binaryMatrix) { int rows = binaryMatrix.Dimensions()[0]; int cols = binaryMatrix.Dimensions()[1]; // 使用 Binary search,取得每行上最小的1位置 int minPos = cols; int r,m,l; for(int i = 0; i < rows; i++) { l = 0; r = cols; while(l < r) { m = (r-l)/2+l; if(binaryMatrix.Get(i,m)==0) { l = m + 1; } else { r = m; } } minPos = r < minPos ? r: minPos; } return minPos < cols ? minPos: -1; } }