在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof
解题思路:
1 需要两个指针col和row,col代表每次循环从第index行第col列开始,row代表每次循环从第row行第index列开始
2 从尾到头遍历第p行上的数,若找到target,返回true,否则找到<target的数就退出循环,记录当前列数。
从尾到头遍历第q列上的数,若找到target,返回true,否则找到<target的数就退出循环,记录当前行数。
3 若没有找到target,index就++,进行下一次循环
4 终止条件,index>row || index>col,返回false,说明target不存在
解题代码
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if (matrix.length==0){
return false;
}
int row = matrix.length-1;//行
int col = matrix[0].length-1;//列
int index = 0;
while (index<=row && index<=col) {
for (int i = row; i >= index; i--) {
if (matrix[i][index] == target) {
return true;
} else if (matrix[i][index] < target) {
row = i;
break;
}
}
for (int j = col; j >= index; j--) {
if (matrix[index][j] == target) {
return true;
} else if (matrix[index][j] < target) {
col = j;
break;
}
}
index++;
}
return false;
}
}
结果:一看这题,第一个想法就想到遍历二维数组,找找对应的值,但是花费时间可想而知。苦思冥想后,想出了这种方法,发现题解也好多这种思路,有点小开心。不过代码应该还有很多可以优化的地方,等后续优化吧。