在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
核心思想明确:查找的本质是排除的过程
最容易想到的解决思路就是:将二维数组遍历一遍,比较数组元素中的值是否有与目标值相等的元素,如果有则返回true,没有则返回false。
代码如下:
public class Solution {
public boolean Find(int target, int [][] array) {
for(int r = 0;r < array.length;r++){
for(int c = 0;c < array[0].length;c++){
if(array[r][c] == target){
return true;
}
}
}
return false;
}
}
虽然这种方法可以解决该问题,但是该算法的时间复杂度为O(n^2),一次只能排除一个元素,效率过低,而且我们也没有用到题中所给条件 “每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序”的特点来解决,如果可以那么一次就可以排除一列或一行元素,即可提高解决问题的效率。
解决思路:
如数组样式如下:
1 2 3 4
2 3 4 5
3 4 5 6
假设我们先从第一行的最后一个元素开始比较,那么如果目标值比它还小,就可以排除最后一列;如果目标值比它还大就可以排除第一行…这样的思路来解决。
代码如下:
public class Solution {
public boolean Find(int target, int [][] array) {
if(array == null){
return false;
}
int i = 0;
int j = array[0].length - 1;
while(i < array.length && j >= 0){
if(target < array[i][j]){//array[i][j]一定是当前行最大的,当前列最小的
j--;//排除该列
}else if(target > array[i][j]){
i++;//排除该行
}else{
return true;
}
}
return false;
}
}