在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

示例:

现有矩阵 matrix 如下:

  1. [
  2. [1, 4, 7, 11, 15],
  3. [2, 5, 8, 12, 19],
  4. [3, 6, 9, 16, 22],
  5. [10, 13, 14, 17, 24],
  6. [18, 21, 23, 26, 30]
  7. ]

给定 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. [
  2. [1, 4, 7, 11, 15],
  3. [2, 5, 8, 12, 19],
  4. [3, 6, 9, 16, 22],
  5. [10, 13, 14, 17, 24],
  6. [18, 21, 23, 26, 30]
  7. ]

思路

暴力的思路很简单,就是一个一个的遍历,遇到相等的就直接返回true;否则返回false即可。

代码

  1. public boolean findNumberIn2DArray(int[][] matrix, int target) {
  2. int n = matrix.length;
  3. int m = matrix[0].length;
  4. for(int i = 0;i<m;i++){
  5. for(int j = 0;j<n;j++){
  6. System.out.println(matrix[i][j]);
  7. if(matrix[i][j] == target){
  8. return true;
  9. }
  10. }
  11. }
  12. return false;
  13. }

解题方案2:模拟方向1(从左下角看)

  1. [
  2. [1, 4, 7, 11, 15],
  3. [2, 5, 8, 12, 19],
  4. [3, 6, 9, 16, 22],
  5. [10, 13, 14, 17, 24],
  6. [18, 21, 23, 26, 30]
  7. ]

思路

  • 标签:数组遍历
  • 从矩阵的左下角看,上方的数字都比其小,右方的数字都比其大,所以依据规律去判断数字是否存在;
  • 舍当前数字为cur,目标数字为target,当target < cur时,cur更新为其上面的数字,当target > cur时,cur更新为其右侧的数字,直到相等则返回true,否则到了矩阵边界返回false;
  • 时间复杂度:O(m + n);

代码1

从左下角看

  1. public boolean findNumberIn2DArray(int[][] matrix, int target) {
  2. if(matrix == null || matrix.length == 0 ){
  3. return false;
  4. }
  5. int i = 0;//每行的开始
  6. int j = matrix.length - 1;//所有行的结束
  7. int k = matrix[0].length;//每行多少个数据
  8. while ( i < k && j >= 0){
  9. int cur = matrix[j][i];
  10. if (cur == target){
  11. return true;
  12. }else if( cur > target){
  13. j--;
  14. }else if(cur < target){
  15. i++;
  16. }
  17. }
  18. return false;
  19. }

解题方案3:模拟方向(从左上角看)

  1. [
  2. [1, 4, 7, 11, 15],
  3. [2, 5, 8, 12, 19],
  4. [3, 6, 9, 16, 22],
  5. [10, 13, 14, 17, 24],
  6. [18, 21, 23, 26, 30]
  7. ]

思路

其实从哪个角看无所谓,重要的是,如何把控方向;

  • 现在从左上角(⬅️⬆️)看,也就是元素

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;

代码

  1. public boolean findNumberIn2DArray(int[][] matrix, int target) {
  2. if(matrix == null || matrix.length == 0 ){
  3. return false;
  4. }
  5. int rows = matrix.length;
  6. int columns = matrix[0].length;
  7. int row =0;
  8. int column = columns - 1;
  9. while (row < rows && column >= 0){
  10. int cur = matrix[row][column];
  11. if(cur == target) {
  12. return true;
  13. }
  14. else if(cur > target) {
  15. column--;
  16. }
  17. else {
  18. row++;
  19. }
  20. }
  21. return false;
  22. }