力扣热题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
相关推荐
山烛13 分钟前
KNN 算法中的各种距离:从原理到应用
人工智能·python·算法·机器学习·knn·k近邻算法·距离公式
guozhetao25 分钟前
【ST表、倍增】P7167 [eJOI 2020] Fountain (Day1)
java·c++·python·算法·leetcode·深度优先·图论
吃着火锅x唱着歌28 分钟前
LeetCode 611.有效三角形的个数
算法·leetcode·职场和发展
墨染点香31 分钟前
第七章 Pytorch构建模型详解【构建CIFAR10模型结构】
人工智能·pytorch·python
技术卷33 分钟前
详解力扣高频SQL50题之619. 只出现一次的最大数字【简单】
sql·leetcode·oracle
阿什么名字不会重复呢1 小时前
在线工具+网页平台来学习和操作Python与Excel相关技能
python·数据分析
Vertira1 小时前
python 阿里云 安装 dashscope的简介、安装
开发语言·python
gc_22992 小时前
学习Python中Selenium模块的基本用法(1:简介)
python·selenium
先做个垃圾出来………3 小时前
2116. 判断一个括号字符串是否有效
python
兮℡檬,3 小时前
房价预测|Pytorch
人工智能·pytorch·python