题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路
方法一:暴力搜索
1、思路:遍历数组中的所有元素并与该整数进行比较。
2、代码:
class Solution {
public:
bool Find(int target, vector<vector<int>> array) {
if (array.empty() || !target)
return false;
int i, j;
for (i = 0; i < array.size(); i++) {
for (j = 0; j < array[0].size(); j++) {
if (target == array[i][j]) return true;
}
}
return false;
}
};
3、复杂度:
时间复杂度:O();
空间复杂度:O(1)。
方法二:二分法查找
1、思路:一般在有序的一维数组中,用二分法查找某数是通过比较“中间点”然后不断缩小查找范围,而在此题中虽然是二维数组,但是在数组的行列上存在有序关系,如果能想到以数组的右上角或左下角为“中间点”进行比较,则此题便能迎刃而解。下面以右上角为例,由于数组每一行从左到右递增,每一列从上到下递增,因此:
- 若目标值小于当前右上角值,则目标值必定小于右上角值所在列,因此左移一列;
- 若目标值等于当前右上角值,则返回True,表示数组中含有该整数;
- 若目标值大于当前右上角值,则目标值必定大于右上角值所在行,因此下移一行;
重复上述步骤,若数组行或列索引值越界,则判断数组中不存在该整数。
2、代码:
class Solution {
public:
bool Find(int target, vector<vector<int>> array) {
if (array.empty() || !target)
return false;
int i = 0, j = array[0].size()-1;
//这里要注意循环终止判断条件为数组索引越界
while(i < array.size() && j > -1) {
if (target < array[i][j]) j--;
else if (target > array[i][j]) i++;
else return true;
}
return false;
}
};
3、复杂度:
时间复杂度:O(m+n),其中m和n分别为数组的行数和列数;
空间复杂度:O(1)。
方法三:十字分割法
1、思路:把二维数组分割成四个等大小区域,比较目标值与中间值的大小,可以排除左上角或右下角区域,对剩下三部分区域继续进行递归判断,每次都可以排除1/4的数据。