运用了递推的方法。
对于这样一个矩阵的任一子块,它的最小值总是在左上角,最大值总是在右下角,那么首先从对角线上的元素和target一个个比较,直到找到一个比target大的元素,以这个元素的左边和上边为界,将矩阵分成四个部分,则左上部分中的元素一定比target小,右下部分中的元素一定比target大,因此只需考虑左下和右上部分的元素。
将左下和右上部分重复上述步骤,最后就可以判断矩阵是否存在值为target的元素。
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
bool res = false;
int l1 = matrix.size();
int l2 = matrix[0].size();
recursion(matrix, 0, 0, l1 - 1, l2 - 1, res, target);
return res;
}
void recursion(vector<vector<int>>& matrix, int rowS, int colS, int rowE, int colE, bool& res, int target) {
if (rowS == rowE && colS == colE) {
if (matrix[rowS][colS] == target) res = true;
}
else if (rowS <= rowE && colS <= colE){
int row = rowS - 1, col = colS - 1;
int l1 = rowE - rowS, l2 = colE - colS;
int maxi = max(l1, l2);
for (int i = 0; i <= maxi; i++) {
if (i <= l1 && i <= l2) {
row++; col++;
}
else if (i > l1 && i <= l2)
col++;
else row++;
if (matrix[row][col] == target) {
res = true;
break;
}
else if (matrix[row][col] > target) {
recursion(matrix, rowS, col, row - 1, colE, res, target);
recursion(matrix, row, colS, rowE, col - 1, res, target);
break;
}
}
}
}
};