📜  算法|搜寻|问题4(1)

📅  最后修改于: 2023-12-03 15:41:09.451000             🧑  作者: Mango

算法 | 搜索 | 问题4
问题描述

给定一个二维矩阵和一个目标值,判断矩阵中是否存在这个目标值。该矩阵具有以下特性:

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

示例1:

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

示例2:

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false
方案1:暴力查找

直接遍历矩阵中的每一个元素,然后和目标值进行比较。

def searchMatrix(matrix, target):
    for i in range(len(matrix)):
        for j in range(len(matrix[0])):
            if matrix[i][j] == target:
                return True
    return False

时间复杂度:$O(mn)$

空间复杂度:$O(1)$

方案2:二分法查找

对于每一行,使用二分法查找出是否存在目标值。

def searchMatrix(matrix, target):
    if not matrix or not matrix[0]:
        return False
    n = len(matrix[0])
    for i in range(len(matrix)):
        if matrix[i][0] <= target <= matrix[i][n-1]:
            left, right = 0, n-1
            while left <= right:
                mid = (left + right) // 2
                if matrix[i][mid] == target:
                    return True
                elif matrix[i][mid] < target:
                    left = mid + 1
                else:
                    right = mid - 1
    return False

时间复杂度:$O(m \log n)$

空间复杂度:$O(1)$

方案3:两次二分法查找

对于每一行的最后一个数,使用二分法查找出是否存在目标值所在的行,然后对该行使用二分法查找出是否存在目标值。

def searchMatrix(matrix, target):
    if not matrix or not matrix[0]:
        return False
    def binary_search_row(matrix, target):
        left, right = 0, len(matrix)-1
        while left <= right:
            mid = (left + right) // 2
            if matrix[mid][0] <= target <= matrix[mid][-1]:
                return mid
            elif matrix[mid][-1] < target:
                left = mid + 1
            else:
                right = mid - 1
        return -1
    def binary_search_col(matrix, row, target):
        left, right = 0, len(matrix[0])-1
        while left <= right:
            mid = (left + right) // 2
            if matrix[row][mid] == target:
                return True
            elif matrix[row][mid] < target:
                left = mid + 1
            else:
                right = mid - 1
        return False
    row = binary_search_row(matrix, target)
    if row == -1:
        return False
    return binary_search_col(matrix, row, target)

时间复杂度:$O(\log m+\log n)$

空间复杂度:$O(1)$