二分搜索变种
先按行搜索,然后按列搜索
代码:
1 bool searchMatrix(vector<vector<int> > &matrix, int target) { 2 if (matrix.empty() || matrix[0].empty()) return false; 3 4 int m = matrix.size(); 5 int n = matrix[0].size(); 6 int l, r, t, b; 7 8 t = 0; 9 b = m - 1; 10 while (t <= b) { 11 int c = (t + b) / 2; 12 if (matrix[c][0] == target) 13 return true; 14 else if (matrix[c][0] < target) 15 t = c + 1; 16 else 17 b = c - 1; 18 } 19 if (b < 0) 20 return false; 21 22 l = 0; 23 r = n - 1; 24 while (l <= r) { 25 int c = (l + r) / 2; 26 if (matrix[b][c] == target) 27 return true; 28 else if (matrix[b][c] < target) 29 l = c + 1; 30 else 31 r = c - 1; 32 } 33 34 return false; 35 }
《Cracking the Code》中也有这道题,答案给出了另一种"走地图"式的解法,挺巧妙,但是效率不如上面的二分法。