二维数组中的查找
一:题目描述
给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中
Consider the following matrix:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
Given target = 5, return true.
Given target = 20, return false.
要求时间复杂度 O(M + N),空间复杂度 O(1)。
二:思路
由题目我们不难发现,该二维数组中的任意一个数一定大于该数的左边的数字,一定小于下面的数字,例如数据16,一定大于9,小于17。
所以根据这个规律我们可以有以下思路:
- 从二维数组的最右上端的数据开始,也就是array[0][array[0].lenght-1];
- 当待查找数据比当前数小,则向左变移动,然后再次判断
- 当待查数据比当前数据大,则向下移动,然后再次判断
- 当待查数据与当前数据相同,证明找到数据。
三:代码
/*
思路:
从二维数组的最右上端开始判断,如果寻找数比当前数小向左移动,
再次比较,若大,向下移动,
*/
public static boolean findValue(int[][] array,int value){
//首先判断是否符合标准
if (array == null || array.length<=0||array[0].length<=0){
return false;
}
int r = 0;
int d = array[0].length-1; //列数
//从二维数组的右上角开始判断查找
while (r<=array.length-1&&d>=0){
//如果正好相等
if (value == array[r][d]){
return true;
}else if (value<array[r][d]){
//行数不变,列数变
d--;
}else if (value > array[r][d]){
//列数不变,行数变
r++;
}
}
return false;
}