题目链接:二维数组中的查找
描述
在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
数据范围:矩阵的长宽满足 0≤n,m≤500 , 矩阵中的值满足 **0≤val≤10^9 ** 进阶:空间复杂度 O(1) ,时间复杂度 O(n+m)
代码实现与解题思路
题目所知,从左到右和从上到下都是递增的顺序排序,那么就给提供了很好的解题思路,可以想一种二分的思想。正常的二分的情况,就是如果目标数和索引数比较,比索引数小,那么从左边二分,反之从右边二分。
这个题的情况我是从起始点开始,起始点的选择就是四个角,每个角都可以,差别就是路径判断的不同。
我选的是从左下角开始,如果目标值比索引位置值小,那么就向上移动一位,继续比较,如果比索引位置值大,那么就向右移动一位,继续比较。当超出边界,那么就循环终止,跳出循环。 过程如下图所示:
代码如下。
public boolean Find (int target, int[][] array) {
//如果数组长度为0,直接返回false
if(array.length==0){
return false;
}
//初始位置的y与x,我选择的是左下角
int y = array.length-1;
int x = 0;
//当x与y超出边界,循环终止
while(y>=0 && x<array[y].length){
//找到目标值就返回true
if(target == array[y][x]){
return true;
}
//如果目标值大于索引位置值,向右移动
if(target>=array[y][x]){
x++;
continue;
}
//如果目标值小于索引位置值,向上移动
if(target<array[y][x]){
y--;
}
}
//循环结束,说明没找到,返回false
return false;
}