二维数组中的查找
LeetCode:《剑指offer》04.二维数组中的查找
问题描述:
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
示例:
[
[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]
]
toFind = 5;//返回true
toFinf = 20;//返回false
解题思路
首先选取数组中右上角(左下角也可以)的数字,如果该数字等于要查找的数字,那么查找过程结束;如果该数字大于要查找的数字,则剔除这个数字所在的列,因为它所在的列的所有值都比要查找的数字大;如果该数字小于要查找的数字,则剔除这个数字所在的行,因为它所在的列的所有值都比要查找的数字小;也就是说,如果查找的数字不在数组(新查找范围)的右上角,则每次都能剔除一行或者一列,每次都可以缩小查找的范围,直到找到要查找的数字,或者查找不到。
考点:二维数组在内存中占据连续的空间
代码示例:
//二维数组中的查找
public static boolean findNumber(int[][] matrix, int target){
if(matrix ==null|| matrix.length==0){
return false;
}
int i=0;//
int j= matrix[0].length-1;
//小心二维数组中的长度变化,行数和列数分别如何表示
while(j>=0&& i<= matrix.length-1){
int now = matrix[i][j];
if(target ==now){
return true;
}
if(target < matrix[i][j]){
//列数-1
j--;
}else{
//行数+1
i++;
}
}
return false;
}