First I wrote a bruteforce solution, but it didn't pass because of too many calls, the time complexity is O(m*n):
public int leftMostColumnWithOne(BinaryMatrix binaryMatrix) { List<Integer> dimensions = binaryMatrix.dimensions(); int m = dimensions.get(0), n = dimensions.get(1); for(int j=0;j<n;j++){ for(int i=0;i<m;i++){ if(binaryMatrix.get(i,j)==1) return j; } } return -1; }
The I improve the solution above with binary search, as the rows are sorted, so we can use binary search to find the column, the time complexity is O(m*logn).
public int leftMostColumnWithOne(BinaryMatrix binaryMatrix) { List<Integer> dimensions = binaryMatrix.dimensions(); int m = dimensions.get(0), n = dimensions.get(1); int l = 0, r = n, mid = 0; while(l<r){ mid = (l+r)/2; if(hasOne(binaryMatrix, mid, m)) r = mid; else l = mid+1; } return r==n?-1: r; //if there are no columns contain 1, the r would be n at last. } private boolean hasOne(BinaryMatrix binaryMatrix, int col, int m){ for(int i=0;i<m;i++){ if(binaryMatrix.get(i, col)==1) return true; } return false; }
Using 万能模版
public int leftMostColumnWithOne(BinaryMatrix binaryMatrix) { List<Integer> dimensions = binaryMatrix.dimensions(); int m = dimensions.get(0); int n = dimensions.get(1); int l =0, r = n-1; while(l+1<r){ int mid = (l+r)/2; if(hasOne(binaryMatrix, mid, m)) r=mid; else l=mid; } if(hasOne(binaryMatrix, l, m)) return l; if(hasOne(binaryMatrix, r, m)) return r; return -1; } private boolean hasOne(BinaryMatrix binaryMatrix, int col, int rows){ for(int i=0;i<rows;i++){ if(binaryMatrix.get(i, col)==1) return true; } return false; }