leetcode hot100 74. 搜索二维矩阵 二分查找 medium


矩阵满足:

  1. 每行递增
  2. 下一行的第一个元素 > 上一行的最后一个元素

这意味着:整个矩阵如果按行"拉直",是一个严格递增的一维数组

所以可以直接用 二分查找。

不需要真的展开数组,只需要"映射索引"。

coffeescript 复制代码
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        m = len(matrix)
        n = len(matrix[0])

        left = 0
        right = m * n - 1

        while left <= right:
            mid = (left+right)//2
            row = mid // n   # 不需要真的展开数组,只需要"映射索引"。
            col = mid % n

            if matrix[row][col] > target:
                right = mid - 1
            elif matrix[row][col] < target:
                left = mid+1
            else:
                return True

        return False  # 找不到

时间复杂度 O(log(mn))

空间复杂度:O(1)

相关推荐
mmmmath_31 小时前
LeetCode.199.二叉树的右视图
数据结构·leetcode
Nil2086 小时前
leetcode 198打家劫舍
算法·leetcode·职场和发展
mmmmath_37 小时前
LeetCode.429.N叉树的层序遍历
数据结构·leetcode
INGNIGHT12 小时前
593 · 石头游戏 II (区间dp石子合并 翻倍循环问题)
leetcode
aqiu11111112 小时前
【C++算法打怪专栏】LeetCode 402. 移掉 K 位数字(单调栈 + 贪心)
c++·算法·leetcode
第六种自由13 小时前
[路飞]_Leetcode 22. 括号生成
javascript·算法·leetcode
longlongzihan14 小时前
LeetCode 24.两两交换链表中的节点:虚拟头结点与指针
算法·leetcode·链表
Xin77014 小时前
LeetCode 105. 从前序与中序遍历序列构造二叉树(递归分治法)
leetcode
longlongzihan14 小时前
从LeetCode 19. 删除链表的倒数第 N 个结点深入理解“哨兵节点”
c++·算法·leetcode·链表
java_nnnn15 小时前
LeetCode刷题滑动窗口(长度最小的子数组)
算法·leetcode·职场和发展