力扣热题100之搜索二维矩阵 II

题目

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

每行的元素从左到右升序排列。

每列的元素从上到下升序排列。

代码

方法一:直接全体遍历

这个方法很直接,但是居然没有超时,很震惊

bash 复制代码
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        for row in matrix:
            for element in row:
                if element==target:
                    return True
        return False

方法一:缩小搜索范围(自己想方法)

这个方法是通过边界缩小搜索的范围

bash 复制代码
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        m=len(matrix)
        n=len(matrix[0])
        row=0
        col=0
        for i in range(m):
            if matrix[i][n-1]>target:
                row=i
                break
            elif matrix[i][n-1]==target:
                return True
        for j in range(n):
            if matrix[m-1][j]>target:
                col=j
                break
            elif matrix[m-1][j]==target:
                return True
        for i in range(row,m-1):
            for j in range(col,n-1):
                if matrix[i][j]==target:
                    return True
        return False        

方法三:二分法

在矩阵的每一行中使用二分法查找target的应该插入的位置索引,代码中是使用的bisect中的bisect_left函数实现的

bisect_left是返回第一个大于等于目标值的位置(即插入后目标值位于所有相同值左侧)

bisect_left是返回第一个严格大于目标值的位置(即插入后目标值位于所有相同值右侧)

bash 复制代码
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        for row in matrix:
            idx=bisect.bisect_left(row, target)
            if idx<len(row) and row[idx]==target:
                return True
        return False

方法四:Z字形搜索

该方法就是从矩阵的右上角开始往矩阵的右下角搜索,如果当前值大于target,列标减一;如果当前值小于target,行标加一。很巧妙很有意思的一种方法

bash 复制代码
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        m,n=len(matrix),len(matrix[0])
        x,y=0,n-1
        while x<m and y>=0:
            if matrix[x][y]==target:
                return True
            if matrix[x][y]>target:
                y-=1
            else:
                x+=1
        return False
相关推荐
Yolanda_20225 分钟前
在vscode终端中可使用pip,但是cmd终端中找不到命令 pip问题的解决
vscode·python·conda·pip
2301_7644413316 分钟前
用动力学系统(微分方程)为 Kernberg 的客体关系单元提供数学化的操作定义,把“自体—客体“这对心理结构建模成一个二维耦合系统
数据结构·python·算法·数学建模
keep intensify31 分钟前
最长有效括号
算法·leetcode·动态规划
dogstarhuang35 分钟前
用 Doubao-Seed-Evolving + Python 免费写一个网页正文提取工具(实战教程)
爬虫·python·ai编程
CoderYanger35 分钟前
A.每日一题:1979. 找出数组的最大公约数
java·程序人生·算法·leetcode·面试·职场和发展·学习方法
猫头虎1 小时前
什么是ZCode for GLM-5.2?
开发语言·人工智能·python·科技·算法·ai编程·ai写作
心运软件1 小时前
Python实战:中国大学排行榜数据采集与可视化大屏
后端·python
长不胖的路人甲2 小时前
什么是赫夫曼树(哈夫曼树 / Huffman Tree)
python·算法·霍夫曼树
魔镜er2 小时前
03-张量
人工智能·pytorch·python
37.2℃9952 小时前
Claude Design哪个公司技术好
python·设计模式