题目:
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
- Integers in each row are sorted in ascending from left to right.
- Integers in each column are sorted in ascending from top to bottom.
Example:
Consider the following matrix:
[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ]
Given target = 5
, return true
.
Given target = 20
, return false
.
代码:
方法一——(分成四块进行搜索):
class Solution {
public:
bool helper(int i,int j,int k,int h,vector<vector<int>>& matrix,int target) {
if (h < j || k < i)return false;
if (target<matrix[i][j] || target>matrix[k][h])return false;
int mid_l = i + (k - i) / 2, mid_r = j + (h - j) / 2;
if (matrix[mid_l][mid_r] == target)return true;
return helper(i, j, mid_l, mid_r, matrix, target)||helper(i,mid_r+1,mid_l,h,matrix,target)|| helper(mid_l + 1, j, k, mid_r, matrix, target)|| helper(mid_l + 1, mid_r + 1, k, h, matrix, target);
}
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int h = matrix.size(); if (h == 0)return false;
int w = matrix[0].size(); if (w == 0)return false;
return helper(0, 0, h - 1, w - 1, matrix, target);
}
};
方法二——从数组中寻找规律:
class Solution {
public:
bool searchMatrix(vector<vector<int> > &matrix, int target) {
if (matrix.empty() || matrix[0].empty()) return false;
if (target < matrix[0][0] || target > matrix.back().back()) return false;
int x = matrix.size() - 1, y = 0;
while (true) {
if (matrix[x][y] > target) --x;
else if (matrix[x][y] < target) ++y;
else return true;
if (x < 0 || y >= matrix[0].size()) break;
}
return false;
}
};
想法:
没啥想法,要开动脑筋!!