二维数组中的查找
题目
题目:在一个二维数组中,每一行都按照从左到右的顺序进行了排序,每一列都按照从上到下进行了排序。
输入这样的一个二维数组arr和一个整数k,判断数组中是否存在这个数。
思路
1: 从左上角开始依次遍历寻找,时间复杂度o(n)
2: 利用题目信息,从左到右,从上到下有序。在右上角的值在该所在的行是最大的,在所在的列是最小的,将该值与目标数对比,如果大于目标数,则直接去除该行则可以了(因为它本身就是所在行最大的数了)。如果小于目标数,则直接去除该列。相等直接返回即可。
3: 左下角也是可以的,原理同右上角。为啥左上和右下角不可以,因为左上角在该行或该列都是最小的,一次比较只能排除本身,并不能直接排除整行或整列。右下角也是如此。
测试用例
1) 二维数组中包含要查找的数字(例如最大值、最小值、中间的值)
2)二维数组中不包含要查找的数字,会有如下三种情况:
2.1)要查找的值小于二维数组中的最小值
2.2)要查找的值大于二维数组中的最大值
2.3)要查找的值在二维数组的最大值与最小值之间但是不存在此值。
3)特殊输入测试(空数组)
实现代码
public class Solution {
//从右上角开始排除(也可以从左下角开始)
//因为右上角的数是在该行是最大,列最小,可以快速去除某一行或某一列
public boolean Find(int target, int [][] array) {
if(array.length <= 0)
return false;
int rows = array.length;
int columns = array[0].length;
int row = 0; //定位到右上
int column = columns - 1;
while(row < rows && column >= 0){
if(array[row][column] == target){ //匹配到则返回true
return true;
}
else if(array[row][column] > target){ //右上角的值大于目标值,则除去这一列
column--;
}
else{ //右上角的值小于目标值,则除去这一行
row ++;
}
}
return false;
}
}