题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。形如:
1 2 34
5 6 78
9 10 1112
13 14 1516
解法1:
利用两层循环遍历整个二维数组,时间复杂度为O(n^2)
解法2:
观察二维数组,发现数组有序,所以如果选择左下角(右上角)的节点,那么目标数当小于这个数的时候我们就向上一行,当目标数大于这个数的时候我们就向右遍历,可以减少一定的遍历次数.
代码如下:
public boolean Find(int[][] array, int target) {
int row = array.length - 1;
int col = 0;
int end = 0;
while (true) {
if (end < array.length &&
array[end].length != 0 &&
target > array[end][array[end].length - 1]) {
end++;
} else {
break;
}
}
while (row >= end && col != array[end].length) {
//首先找到合适的左下角开始点
if (target < array[row][col]) {
row--;
} else if (target > array[row][col]) {
col++;
} else {
return true;
}
}
return false;
}