题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例1
输入
复制
7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值
复制
true
解法1:该二维数组每一行从左到右递增,从上到下递增,因此我们可以遍历每一行,查看每一行的首尾大小,如果target在这个范围内,我们可以遍历处于该行的数组,来判断是否存在target,若不存在继续遍历下一行。需要注意的是该二维数组是否为空,并且行列数是否大于0。
代码如下:
public class Solution {
public boolean Find(int target, int [][] array) {
if (null == array) {
return false;
}
int rows = array.length;
int cols = array[0].length;
if (cols <=0 || rows <= 0) {
return false;
}
for (int row = 0; row < rows; row++) {
if (target < array[row][0] || target >array[row][cols - 1]) {
continue;
}
for(int col = 0; col < cols; col++)
if (array[row][col] == target) {
return true;
}
}
return false;
}
}
解法2:基于解法1的描述,我们可以先从二维数组的右上角开始查找target,如果该元素大于target,需要向右查找,因为"该二维数组每一行从左到右递增,从上到下递增",因此如果小于则向下查找,依次进行查找,当所查找的行和列不在二维数组的行列范围内,说明不存在target,那么需要返回false。
代码如下:
public class Solution {
public boolean Find(int target, int [][] array) {
if (null == array) {
return false;
}
int rows = array.length;
int cols = array[0].length;
if (cols <=0 || rows <= 0) {
return false;
}
int row = 0;
int col = cols - 1;
while(row<rows && col>=0){
if(array[row][col]== target){
return true;
}else if(array[row][col]>target){
col--;
}else{
row++;
}
}
return false;
}
}