在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例:
现有矩阵 matrix 如下:
[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]]
给定 target = 5,返回 true。
给定 target = 20,返回 false。
限制:
0 <= n <= 1000
0 <= m <= 1000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题方案1:暴力
[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]]
思路
暴力的思路很简单,就是一个一个的遍历,遇到相等的就直接返回true;否则返回false即可。
代码
public boolean findNumberIn2DArray(int[][] matrix, int target) {int n = matrix.length;int m = matrix[0].length;for(int i = 0;i<m;i++){for(int j = 0;j<n;j++){System.out.println(matrix[i][j]);if(matrix[i][j] == target){return true;}}}return false;}
解题方案2:模拟方向1(从左下角看)
[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]]
思路
- 标签:数组遍历
- 从矩阵的左下角看,上方的数字都比其小,右方的数字都比其大,所以依据规律去判断数字是否存在;
- 舍当前数字为cur,目标数字为target,当target < cur时,cur更新为其上面的数字,当target > cur时,cur更新为其右侧的数字,直到相等则返回true,否则到了矩阵边界返回false;
- 时间复杂度:O(m + n);
代码1
从左下角看
public boolean findNumberIn2DArray(int[][] matrix, int target) {if(matrix == null || matrix.length == 0 ){return false;}int i = 0;//每行的开始int j = matrix.length - 1;//所有行的结束int k = matrix[0].length;//每行多少个数据while ( i < k && j >= 0){int cur = matrix[j][i];if (cur == target){return true;}else if( cur > target){j--;}else if(cur < target){i++;}}return false;}
解题方案3:模拟方向(从左上角看)
[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]]
思路
其实从哪个角看无所谓,重要的是,如何把控方向;
- 现在从左上角(⬅️⬆️)看,也就是元素
1,坐标为(0,0)的位置;
- 设:target=5,当前位置的元素的数据为cur;
- (0,0)时,cur=1,cur < 5;则列的位置移动到第二列;此时的坐标为(1,0),cur=4;
- cur(4) > target(5),移动到第二行,此时坐标为(1,1),cur=5
- cur(5) == target(5),则返回true
- 否则找不到,就返回false;
代码
public boolean findNumberIn2DArray(int[][] matrix, int target) {if(matrix == null || matrix.length == 0 ){return false;}int rows = matrix.length;int columns = matrix[0].length;int row =0;int column = columns - 1;while (row < rows && column >= 0){int cur = matrix[row][column];if(cur == target) {return true;}else if(cur > target) {column--;}else {row++;}}return false;}
