题目描述:
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
链接:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof
1.暴力查询
思路分析:遍历整个二维数组,相等则返回true
代码:
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
if(matrix.empty())
return false;
for(int i = 0; i < matrix.size(); ++i)
{
for(int j = 0; j < matrix[i].size(); ++j)
{
if(matrix[i][j] == target)
return true;
}
}
return false;
}
};
2.线性查找
思路分析:根据该二维数组的特性,每一行都是递增的。则最开始对右上角进行遍历,若该数比目标值大,则列下标减小,若该数比目标值大,则行下标增大。
代码:
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
if(matrix.empty())
return false;
int j = matrix[0].size() - 1;
int i = 0;
while(j >= 0 && i < matrix.size())
{
if(matrix[i][j] < target)
++i;
else if(matrix[i][j] > target)
--j;
else
return true;
}
return false;
}
};
3.二分查找
思路分析:单独对每行进行二分查找。
代码:
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
if(matrix.empty())
return false;
for(int i = 0; i < matrix.size(); ++i)
{
int start = 0;
int end = matrix[i].size() - 1;
while(start <= end)
{
int mid = (start + end) >> 1;
if(matrix[i][mid] == target)
return true;
else if(matrix[i][mid] < target)
start = mid + 1;
else
end = mid - 1;
}
}
return false;
}
};