LeetCode-74. 搜索二维矩阵【数组 二分查找 矩阵】

发布于:2024-04-08 ⋅ 阅读:(135) ⋅ 点赞:(0)

题目描述:

给你一个满足下述两条属性的 m x n 整数矩阵:

  • 每行中的整数从左到右按非严格递增顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

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

提示:

m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-104 <= matrix[i][j], target <= 104

解题思路一:先二分查找行,再二分查找列。

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        m, n = len(matrix), len(matrix[0])
        up, down = 0, m - 1
        while up <= down:
            mid = up + (down - up) // 2
            if matrix[mid][0] < target:
                up = mid + 1
            elif matrix[mid][0] > target:
                down = mid - 1
            else:
                return True
        print(matrix[up-1], target)
        left, right = 0, n - 1
        while left <= right:
            mid = left + (right - left) // 2
            if matrix[up-1][mid] < target:
                left = mid + 1
            elif matrix[up-1][mid] > target:
                right = mid - 1
            else:
                return True
        return False

# 同意
class Solution(object):
    def searchMatrix(self, matrix, target):
        M, N = len(matrix), len(matrix[0])
        col0 = [row[0] for row in matrix]
        target_row = bisect.bisect_right(col0, target) - 1
        if target_row < 0:
            return False
        target_col = bisect.bisect_left(matrix[target_row], target)
        if target_col >= N:
            return False
        if matrix[target_row][target_col] == target:
            return True
        return False

时间复杂度:O(logn + logm)
空间复杂度:O(1)

解题思路二:暴力遍历,也能过。

class Solution(object):
    def searchMatrix(self, matrix, target):
        M, N = len(matrix), len(matrix[0])
        for i in range(M):
            for j in range(N):
                if matrix[i][j] == target:
                    return True
        return False

时间复杂度:O(nm)
空间复杂度:O(1)

解题思路三:用python的in。

class Solution(object):
    def searchMatrix(self, matrix, target):
        M, N = len(matrix), len(matrix[0])
        for i in range(M):
            if target > matrix[i][N - 1]:
                continue
            if target in matrix[i]:
                return True
        return False

时间复杂度:O(logn + m)
空间复杂度:O(1)


网站公告

今日签到

点亮在社区的每一天
去签到