class Solution { public: bool searchMatrix(vector<vector<int> > &matrix, int target) { int rowNum = insertPosition(matrix, target); if(rowNum == -1) return true; else return search(matrix, target, rowNum); } int insertPosition(vector<vector<int> > &matrix, int target) { int rows = matrix.size(); int left = 0; int right = rows - 1; while(left <= right) { int middle = left + ((right - left)>>1); if(matrix[middle][0] == target) return -1; else if(target < matrix[middle][0]) right = middle - 1; else left = middle + 1; } if(right < 0) return 0; return right; } bool search(vector<vector<int> > &matrix, int target, int rowNum) { int cols = matrix[0].size(); int left = 0; int right = cols - 1; while(left <= right) { int middle = left + ((right - left)>>1); if(target < matrix[rowNum][middle]) right = middle - 1; else if(target > matrix[rowNum][middle]) left = middle + 1; else return true; } return false; } };
根据题意很自然的想到在纵向和横向分别使用二分查找,其中
纵向查找行号时,在没有找到元素时,需要找到比target小的最大数,也就是
其所在的行就是target有可能存在的行。另外要注意,函数insertPosition()中返回的
right,根据二分查找的规律来看就是要求的值,但对于right越界的情况需要单独处理
Search a 2D Matrix,布布扣,bubuko.com
原文:http://blog.csdn.net/liyongxin4/article/details/23279225