题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路
根据题目描述我们知道,每一个元素的左侧都比自己小,下方都比自己大。
随机选取一个元素(这里选取array[1][2]说明),将矩阵根据该元素可以分割成两部分:
可以发现,当前数字是蓝色区域最大的数字,同样也是绿色部分最小的数字。
由此我们可以从数组的右上角开始判断,如果目标数字大于当前元素值,那么说明,我们的目标值只可能在当前位置的下方;如果目标值小于当前元素值,说明目标值只可能在当前位置的左方。我们根据这个特性,就可以快速判断目标值是否在数组中存在。
举个栗子,假如我们要查找13是否在数组中:
- 首先判断array[0][3]与target的值
- 13小于25(array[0][3]),查找区域缩小,在左侧查找,下一个比较值就是array[0][2]
- 13小于15(array[0][2]),查找区域缩小,在左侧查找,下一个比较值就是array[0][1]
- 13大于9(array[0][1]),查找区域缩小,在下方查找,下一个比较值就是array[1][1]
- 13大于11(array[1][1]),查找区域缩小,在下方查找,下一个比较值就是array[2][1]
- 13等于13(array[2][1]),目标找到,返回true。
代码实现
public class Solution {
public boolean Find(int target, int [][] array) {
//boolean型变量,存储查找状态,默认为false
boolean isExisted = false;
//设置初始坐标
int rowIndex = 0, colIndex = array[0].length - 1;
//循环判断
while (rowIndex < array.length && colIndex >= 0) {
if (target == array[rowIndex][colIndex]) {
//目标找到,修改状态值,跳出循环
isExisted = true;
break;
}
if (target > array[rowIndex][colIndex]) {
//目标比当前值大,向下搜索
rowIndex++;
} else {
//目标比当前值小,向左搜索
colIndex--;
}
}
return isExisted;
}
}