1 public class Solution { 2 private char[][] image; 3 public int minArea(char[][] image, int x, int y) { 4 if (image.length == 0 || image[0].length == 0) { 5 return 0; 6 } 7 this.image = image; 8 int n = image.length, m = image[0].length; 9 int left = searchRow(0, x, 0, m, true);10 int right = searchRow(x + 1, n, 0, m, false);11 int top = searchCols(0, y, 0, n, true);12 int bottom = searchCols(y + 1, m, 0, n, false);13 return (right - left) * (bottom - top);14 }15 16 private int searchCols(int i, int j, int top, int bottom, boolean bound) {17 while (i != j) {18 int k = top;19 int mid = (i + j) / 2;20 while (k < bottom && image[k][mid] == '0') {21 k++;22 }23 if(k < bottom == bound) {24 j = mid;25 } else {26 i = mid + 1;27 }28 }29 return i;30 } 31 32 private int searchRow(int i, int j, int left, int right, boolean bound) {33 while (i != j) {34 int k = left;35 int mid = (i + j) / 2;36 while (k < right && image[mid][k] == '0') {37 k++;38 }39 if(k < right == bound) {40 j = mid;41 } else {42 i = mid + 1;43 }44 }45 return i;46 }47 }
Binary search:
1. The bound is defined to search "0" or "1". When search 0 - x, we want to get the most left "1". So k < right mean there is a one, j = mid. But when we do x - n search, we want to get most left "0". So when k < right, we still need to keep searching mid + 1.