美文网首页
算法 2.4.2 搜索二维矩阵【leetcode 74】

算法 2.4.2 搜索二维矩阵【leetcode 74】

作者: 珺王不早朝 | 来源:发表于2021-02-24 20:18 被阅读0次

    题目描述

    编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

    每行中的整数从左到右按升序排列。
    每行的第一个整数大于前一行的最后一个整数。

    示例 1:
    输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,50]], target = 3
    输出:true

    示例 2:
    输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,50]], target = 13
    输出:false

    示例 3:
    输入:matrix = [], target = 0
    输出:false

    提示:
    m == matrix.length
    n == matrix[i].length
    0 <= m, n <= 100
    -104 <= matrix[i][j], target <= 104

    数据结构

    • 二维数组

    算法思维

    • 二分查找

    解题思路


    一. Comprehend 理解题意
    • 找出一个数字是否存在于某个二维数组中

    二. Choose 选择数据结构与算法
    二分查找法

    1)二分查找第一列,找出目标元素可能存在于哪一行
    2)二分查找目标行,查看元素是否在目标行中
    3)如果存在则返回 true,不存在则返回 false

    三. Code 编码实现基本解法
    class Solution {
    
        public boolean searchMatrix(int[][] matrix, int target) {
    
            int colLen = matrix.length; //每列长度
            if (colLen == 0) return false;
            int rowLen = matrix[0].length; //每行长度
            
            //列遍历用上下指针,行遍历用左右指针
            int up = 0, down = colLen - 1, left = 0, right = rowLen - 1;
    
            //先对列进行二分查找
            while (up < down) {
                int mid = (up + down) / 2;
                if (matrix[mid][0] == target) return true;
                else if (matrix[mid][0] > target) down = mid - 1;
                else up = mid + 1;
            }
    
            /*
             * 跳出循环时会有两种情况:
             * 1.最后一次操作是 down 指针上移,这种情况下 target 只可能在 up 对应行中
             * 2.最后一次操作是 up 指针下移,需要判断当前 up 对应行的第一个元素是否 > target
             *   若是,则说明 up 向下多移了一行,target 只可能在上一行,需要 up--
             * */
            if (matrix[up][0] > target) up--;
            if (up < 0) return false; //如果 up-- 之后 < 0,说明没有上一行,元素不存在
    
            //再对行进行二分查找
            while (left <= right) {
                int mid = (left + right) / 2;
                if (matrix[up][mid] == target) return true;
                else if (matrix[up][mid] > target) right = mid - 1;
                else left = mid + 1;
            }
    
            return false;
        }
        
    }
    

    执行耗时:0 ms,击败了 100.00% 的Java用户
    内存消耗:37.9 MB,击败了 67.24% 的Java用户

    时间复杂度:O(n)
      • 第一列的遍历 O(n)
      • 目标行的遍历 O(n)

    空间复杂度:O(1)
      • 四个指针变量,占用常数级内存空间 O(1)

    四. Consider 思考更优解

    === 待续 ===

    五. Code 编码实现最优解

    === 待续 ===

    六. Change 变形与延伸

    === 待续 ===

    相关文章

      网友评论

          本文标题:算法 2.4.2 搜索二维矩阵【leetcode 74】

          本文链接:https://www.haomeiwen.com/subject/hofefltx.html