力扣热题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
相关推荐
m0_6265352017 分钟前
力扣题目练习 换水问题
python·算法·leetcode
一匹电信狗20 分钟前
【LeetCode_160】相交链表
c语言·开发语言·数据结构·c++·算法·leetcode·stl
软件技术NINI28 分钟前
MATLAB疑难诊疗:从调试到优化的全攻略
javascript·css·python·html
Q_Q19632884751 小时前
python+uniapp基于微信小程序的助眠小程序
spring boot·python·小程序·django·flask·uni-app·node.js
ZYMFZ1 小时前
python面向对象
前端·数据库·python
wangqiaowq1 小时前
ImmutableList.of() 是 Google Guava 库 提供的一个静态工厂方法,用于创建一个不可变的(immutable)列表。
开发语言·windows·python
滑水滑成滑头1 小时前
**发散创新:多智能体系统的探索与实践**随着人工智能技术的飞速发展,多智能体系统作为当今研究的热点领域,正受到越来越多关注
java·网络·人工智能·python
2401_841495641 小时前
【数据结构】最长的最短路径的求解
java·数据结构·c++·python·算法·最短路径·图搜索
流浪大叔1 小时前
Python下载实战技巧的技术文章大纲
开发语言·python