您的位置:首页 > 其它

LeetCode: 240. Search a 2D Matrix II

2016-09-27 20:27 597 查看
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.

For 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 searchMatrix(vector<vector<int>>& matrix, int target) {
if (matrix.size()==0)
return false;
vector<int>::const_iterator cit=upper_bound(matrix[0].begin(),matrix[0].end(),target);
return search(matrix,0,cit!=matrix[0].end()?cit-matrix[0].begin()-1:matrix[0].size()-1,target);
}
bool search(vector<vector<int> >& matrix,int row,const int &col,int target)
{
if (row<matrix.size()&&col<matrix[0].size())
{
int low=0,high=col,mid;
while (low<=high)
{
mid=low+(high-low)/2;
if (matrix[row][mid]==target)
return true;
else if (matrix[row][mid]<target)
low=mid+1;
else if (matrix[row][mid]>target)
high=mid-1;
}
return search(matrix,row+1,high,target);
}
return false;
}
};

不是递归的方法,直接迭代:从左下角开始查找的目的,是防止 j  越界,因为最下面都找不到,那就是不存在。

class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int rows = matrix.size();
if (rows<=0)
return false;
int cols = matrix[0].size();
int i = rows-1;
int j = 0;
while(i>=0 && j<cols){
if (matrix[i][j] == target)
return true;
else if (matrix[i][j]<target)
j++;
else
i--;
}
return false;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: