美文网首页
算法 | *二分查找 - 74. 搜索二维矩阵

算法 | *二分查找 - 74. 搜索二维矩阵

作者: biogeeker | 来源:发表于2020-09-11 17:48 被阅读0次

难度:中等

题目描述

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
1. 每行中的整数从左到右按升序排列。
2. 每行的第一个整数大于前一行的最后一个整数。

示例 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

解题代码

解题思路一:先逐行查找,如果某一行的尾数小于等于 target,返回行坐标,然后对该行进行二分查找。注意空集单独处理。

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        if len(matrix) == 1 and len(matrix[0]) == 0: # 矩阵为空集时
            return False
        index = -1 # 创建 Flag,考虑 target 遍历不到的情况
        for i in range(len(matrix)):
            if target <= matrix[i][-1]:
                index = i
                break # 按顺序查找,找到即终止遍历,赋值为 target 所在行
        if index == -1:
            return False
        # 按行进行二分查找
        left, right = 0, len(matrix[0]) - 1
        while left <= right:
            mid = (left + right)//2
            if matrix[index][mid] < target:
                left = mid + 1
            elif matrix[index][mid] > target:
                right = mid - 1
            else:
                return True
        return False

*解题思路二:这个题要是由二维变成一维就方便很多了,直接使用二分查找就行。

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        m = len(matrix)
        if m == 0:
            return False
        n = len(matrix[0])
        
        # 二分查找
        left, right = 0, m * n - 1
        while left <= right:
                pivot_idx = (left + right) // 2
                pivot_element = matrix[pivot_idx // n][pivot_idx % n]
                if target == pivot_element:
                    return True
                else:
                    if target < pivot_element:
                        right = pivot_idx - 1
                    else:
                        left = pivot_idx + 1
        return False

答案参考:搜索二维矩阵
题目来源:力扣(LeetCode)

相关文章

网友评论

      本文标题:算法 | *二分查找 - 74. 搜索二维矩阵

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