在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
样例
输入数组:
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
如果输入查找数值为7,则返回true,
如果输入查找数值为5,则返回false。
class Solution {
public:
bool searchArray(vector<vector<int>> array, int target) {
// 填写代码
}
};
解题思路:
(单调性扫描) O(n+m)
我们可以看到这个矩阵的规律是按行从左到右递增,按列从上到下递增, 核心就在左下角,样例中给出的数据 6 是
矩阵的最左下角的元素,它是所在行的最小元素, 也是所在列的最大元素, 利用这一点,我们从该位置进行枚举.
假设 我们现在枚举的位置的数 为 x , 如果 x == target(我们要查找的数) , 那就找到了 . 如果 x > target 那么,
是不是就要从所在列 , 从下往上 找 比 x 小的. 否则如果 x < target ,那么,我们就要往右继续 枚举 直到找到该元素.
class Solution {
public:
bool searchArray(vector<vector<int>> array, int target) {
if (array.empty() || array[0].empty())
return false;
int n = array.size(); // 行 ;
int m = array[0].size() ; // 列;
int r = n -1 ;
int c = 0 ;
while(r>=0 && c< m )
{
if(target == array[r][c])
{
return true ;
}
else if (target < array[r][c])
{
// 如果要查找的那个数要比当前 array[r][c]的数 要小的话,就向上查找
r-- ;
}
else
{
// 往右走;
c++ ;
}
}
return false ;
}
};