题目: 二维数组中查找
在二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
对于以下二维数组: 1 3 5 6, 2 5 7 8, 3 4 8 9, 3 4 5 9, 如果查找数字0,则返回false,查找数字5,则返回true。
解题思路
碰到数组这简单呀,撸起袖子遍历整个数组就ok了,是呀。这一切都Ok了,没有毛病。但是细细想想没有优化的地方吗??
仔细审题,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序,那我们可以根据这个规则来,减少判断次数。
根据上面的例子。假如我们需要查找9这个整数,找到数组的第一行最后一列6,这是后9>6,就不需要匹配第一行的元素了,直接第2行第4列的的元素8,发现9>8,这时候也不需要比较第二行元素,跳转第3行第4列的元素9,发现9=9,则找到目标数。。这样的做法可以减少部分的比较。
解题代码
private static boolean find(int[][] maxtrix, int target) {
if (maxtrix == null || maxtrix.length == 0 && maxtrix[0].length == 0) {
int rows = maxtrix.length;
int columns = maxtrix[0].length;
int r = 0, c = columns - 1; //从右上角开始
while (r < rows - 1 && c >= 0) {
if (target == maxtrix[r][c]) {
return true;
} else if (target > maxtrix[r][c]) {
r++;
} else {
c--;
}
}
}
return false;
}
后记
- 摘自《剑指Offter》
- 牛客网