题目描述
在一个二维数组中(每一个一维数组的长度相同), 每一行都按照从左到右递增的顺序排序,每一列都按照从上到下的递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断是否含有该整数
解题思路分析
从本题题干给出的“每一行从左至右递增,每一列从上到下递增”这个信息,我们就应该嗅到解题的关键就在这里,其实一个最简单的解题方法就是暴力法,循环遍历一遍一定可以得到正确的答案,但是考虑到时间复杂度(O(mn) m,n分别为行列的长度),这样解肯定是不行,这也不是这个题目考察的目的,所以这里我们就需要从上面我们提到的那个题干条件入手,找到能够降低时间复杂度的方法。
思考之后我们可以发现,如果我们开始从数组的右肩那个数开始比较,这个问题就找到一个更好方法了,就是从一开始先从右肩那个数进行比较,如果那个数大于我们所要找的数的话,就应该行数不变,列数-1,如果小于我们要找的数,就应该行数+1,这样循环下去,如果数组存在目标整数的话,就一定能找到。
题目源代码
private static boolean find(int target, int[][] array) {
if (array == null) {
return false;
}
int row = array.length, col = array[0].length;
int i = 0, j = col - 1;
while (i < row && j >= 0) {
if (array[i][j] == target) {
return true;
} else if (array[i][j] < target) {
i++;
} else {
j--;
}
}
return false;
}