题目描述:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路:
1.暴力法
通过循环遍历二维数组,用数组中的每一个元素跟目标target进行比较,相同则返回true;否则返回false。时间复杂度:O(n^2)
2.左下角或右上角
由于二维数组是有序的,一行的最左边是最小的,一列的最下面是最大的。因此我们从左下角(右上角)开始查找,以左下角为例(初始时i=行数-1,j=0)有三种情况:
(1)arr[i][j] < target,由于元素已经是一列的最下面,但仍然不够,因此只能右移,即j++
(2)arr[i][j] > target,由于元素已经是一行的最左边,但仍然太大,因此只能上移,即i- -
(2)arr[i][j] == target,找到目标,直接返回即可
时间复杂度:O(行+列)
代码:
public class Solution {
//左下角查找法则
public boolean Find(int target, int [][] array) {
int row = array.length;
int col = array[0].length;
int i = row-1;
int j = 0;
while(j<col && i >=0){
if(array[i][j] < target){
j++;
}
else if(array[i][j] > target){
i--;
}
else{
return true;
}
}
return false;
}
}