码迷,mamicode.com
首页 > 其他好文 > 详细

力扣 - 74. 搜索二维矩阵

时间:2020-12-03 11:50:12      阅读:4      评论:0      收藏:0      [点我收藏+]

标签:containe   line   boolean   lin   lse   head   math   tps   lan   

题目

74. 搜索二维矩阵

思路1(暴力)

  • 遍历二维数组的所有的元素,看看是否存在target

代码

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                if (matrix[i][j] == target) {
                    return true;
                }
            }
        }
        return false;
    }
}

复杂度分析

  • 时间复杂度:\(O(N^2)\),其中 N 为数组长度
  • 空间复杂度:\(O(1)\)

思路2(二分法1)

  • 先找出在哪一行
  • 然后再在那一行进行二分查找,找到目标数字返回true,否则返回false

代码

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        if (matrix.length == 0 || matrix[0].length == 0) {
            return false;
        }
        int flag = matrix.length - 1;
        for (int i = matrix.length - 1; i >= 0; i--) {
            if (matrix[i][0] <= target) {
                flag = i;
                break;
            }
        }
        
        int left = 0;
        int right = matrix[0].length - 1;
        while (left <= right) {
            int mid = left + ((right - left) / 2);
            if (target < matrix[flag][mid]) {
                right = mid - 1;
            } else if (target > matrix[flag][mid]) {
                left = mid + 1;
            } else {
                return true;
            }
        }
        
        return false;
    }
}

复杂度分析

  • 时间复杂度:\(O(N)\),其中 N 为数组长度
  • 空间复杂度:\(O(1)\)

思路3(二分法2)

  • 因为二维数组从上到下从左到右是递增的,我们可以将m*n的二维数组看成长度是m*n的升序数字
  • 对该升序的数字,我们再利用二分查找进行查找
  • 将升序的索引转换为二维数组的行和列的索引如下:
    • row:mid / martix[0].length
    • col:mid % martix[0].length

代码

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        if (matrix.length == 0) {
            return false;
        }
        
        int x = matrix.length;
        int y = matrix[0].length;

        int left = 0;
        int right = x * y - 1;

        while (left <= right) {
            int mid = left + (right - left) / 2;
            // 求行
            int row = mid / y;
            // 求列
            int col = mid % y;
            if (matrix[row][col] < target) {
                left = mid + 1;
            } else if (matrix[row][col] > target) {
                right = mid - 1;
            } else {
                return true;
            }
        }
        return false;
    }
}

复杂度分析

  • 时间复杂度:\(O(logM*N)\),其中 M、N 为数组长度
  • 空间复杂度:\(O(1)\)

力扣 - 74. 搜索二维矩阵

标签:containe   line   boolean   lin   lse   head   math   tps   lan   

原文地址:https://www.cnblogs.com/linzedian/p/14054850.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!