
方法:Z字形查找法、二分法、暴力法
面试最优 Z字形查找法:
核心思想:选对起点,一次排除一行或者一列。
找一个特殊的起点,使得每次比较之后,都能直接排除一整行或者一整列。不用遍历多余的元素。
注意不能选择左上角和右下角,因为左上角是最小的元素,如果target比他大,右边和下边的元素都可能更大,没法排除一行或者一列。右下角最大的元素同理。
可以选右上角和左下角,
右上角的元素matrix[x][y],是当前行最大的元素 ,也是当前列最小的元素。
- 如果
matrix[x][y] == target:直接找到,返回 true; - 如果
matrix[x][y] > target:说明这一列所有元素都比target大(因为列是升序的),直接排除这一列,y--; - 如果
matrix[x][y] < target:说明这一行所有元素都比target小(因为行是升序的),直接排除这一行,x++。
cpp
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
//Z字法:找右上角的元素 来排除一行或者一列 排出后 新的矩阵继续。
int m =matrix.size();
int n = matrix[0].size();
int x=0,y = n-1;
while(x<m && y>=0){
if(matrix[x][y] == target){
return true;
}
if(matrix[x][y]<target){
++x;
}
else{
--y;
}
}
return false;
}
};