LeetCode in Python 74/240. Search a 2D Matrix I/II (搜索二维矩阵I/II)

搜索二维矩阵I其实可以转换为搜索一维数组,原因在于,只要先确定搜索的整数应该在哪一行,即可对该行进行二分查找。

搜索二维矩阵II中矩阵元素排列方式与I不同,但思想大致相同。

目录

[LeetCode in Python 74.](#LeetCode in Python 74.)

[LeetCode in Python 240.](#LeetCode in Python 240.)

LeetCode in Python 74.

示例:

图1 搜索二维矩阵输入输出示例

代码:

python 复制代码
class Solution:
    def searchMatrix(self, matrix, target):
        m, n = len(matrix), len(matrix[0])
        
        def binaSearch(i, j, target):
            l, r = 0, j
            while l <= r:
                mid = (l + r) // 2
                if target > matrix[i][mid]:
                    l = mid + 1
                elif target < matrix[i][mid]:
                    r = mid - 1
                else:
                    return True
            return False

        for i in range(m):
            if target < matrix[i][n - 1]:
                return binaSearch(i, n - 1, target)
            elif target > matrix[i][n - 1]:
                i += 1
            else:
                return True
        return False

解释:

1)首先要判断target可能在哪一行,判断标准是将target与矩阵每一行最后一个元素比较,若大于该元素,则表明target在下一行,反之在这一行(按序一行一行比较)。在确定在哪一行之后,利用二分法在该行查找是否有target,有则True,无则False:

for i in range(m):

if target < matrix[i][n - 1]:

return binaSearch(i, n - 1, target)

elif target > matrix[i][n - 1]:

i += 1

else:

return True

return False

2)在二分查找中注意,target对比的元素为matrix[i][mid],i代表target可能存在的行,即传过去的参数i。

LeetCode in Python 240.

示例:

图2 搜索矩阵II输入输出示意图

代码:

python 复制代码
class Solution:
    def searchMatrix(self, matrix, target):
        m, n = len(matrix), len(matrix[0])
        r, c = m - 1, 0
        while r >= 0 and c < n:
            if target > matrix[r][c]:
                c += 1
            elif target < matrix[r][c]:
                r -= 1
            else:
                return True
        return False 

解释:

1)先确定列再确定行,即从矩阵左下角元素开始比较,target>该元素则右移,反之上移直到找到target返回True或无target返回False。

相关推荐
Mr_Oak9 分钟前
【multi-model】moco系列&SimCLR&BEiT
人工智能·深度学习·神经网络·算法·计算机视觉·transformer·对比学习
不会编程的小寒11 分钟前
C++初始继承,继承中构造、析构顺序
开发语言·python
尼古拉斯·纯情暖男·天真·阿玮21 分钟前
动态规划——子序列问题
java·算法·动态规划
Mos_x1 小时前
关于我们的python日记本
开发语言·python
耳总是一颗苹果1 小时前
数据结构---时空复杂度
数据结构
立志成为大牛的小牛1 小时前
数据结构——四十、折半查找(王道408)
数据结构·学习·程序人生·考研·算法
十重幻想1 小时前
reshape的共享内存
python
孙同学_1 小时前
面试题 16.25. LRU 缓存
leetcode·缓存
Juchecar1 小时前
设计模式不是Java专属,其他语言的使用方法
java·python·设计模式
王哈哈^_^1 小时前
【完整源码+数据集】蓝莓数据集,yolo11蓝莓成熟度检测数据集 3023 张,蓝莓成熟度数据集,目标检测蓝莓识别算法系统实战教程
人工智能·算法·yolo·目标检测·计算机视觉·ai·视觉检测