最优的做法就是从右上角开始。
如果当前点大于target, colIndex–;
如果当前点小于target, rowIndex++;
否则 colIndex–; rowIndex++; count++;
该方法也可以从左下角开始。
Time complexity O(m+n).
Space complexity O(1).
注意:这题的条件没有LintCode 28: Search a 2D Matrix那么严格,那道题是每行元素开头都大于上一行元素结束。所以LintCode 28的binary search解法不能用于这题,但这题的解法可以用于LintCode 28.
代码如下:
class Solution {
public:
/**
* @param matrix: A list of lists of integers
* @param target: An integer you want to search in matrix
* @return: An integer indicate the total occurrence of target in the given matrix
*/
int searchMatrix(vector<vector<int>> &matrix, int target) {
int nRow = matrix.size();
if (nRow == 0) return 0;
int nCol = matrix[0].size();
int count = 0;
int rowIndex = 0;
int colIndex = nCol - 1; //start from the right top point
while (rowIndex < nRow && colIndex >= 0) {
if (matrix[rowIndex][colIndex] > target) {
colIndex--;
} else if (matrix[rowIndex][colIndex] < target) {
rowIndex++;
} else {
count++;
colIndex--;
rowIndex++;
}
}
return count;
}
};