Leetcode-240. 搜索二维矩阵 II

举报
子都爱学习 发表于 2022/02/28 19:24:26 2022/02/28
【摘要】 题目编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例 1:输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5输出:tru...

题目

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

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

示例 1:

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true

1.直接查找

我们直接遍历整个矩阵 matrix,判断 ttarget 是否出现即可。

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

时间复杂度分析:O(n2)

2.二分查找

由于矩阵 matrix 中每一行的元素都是升序排列的,因此我们可以对每一行都使用一次二分查找,判断 target 是否在该行中,从而判断 target 是否出现。

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

时间复杂度分析:O(log2(n))

3.Z字查找

我们可以从矩阵 matrix 的右上角(0,n−1) 进行搜索。在每一步的搜索过程中,如果我们位于位置 (k,v),

如果 matrix[k,v]=target,说明搜索完成;

如果 matrix[k,v]>target,由于每一列的元素都是升序排列的,那么在当前的搜索矩阵中,所有位于第 v列的元素都是严格大于 target 的,因此我们可以将它们全部忽略,即将 v减少 1;

如果 matrix[k,v]<target,由于每一行的元素都是升序排列的,那么在当前的搜索矩阵中,所有位于第 k行的元素都是严格小于 target 的,因此我们可以将它们全部忽略,即将 k增加 1。

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        m,n=len(matrix),len(matrix[0])
        k, v= 0,n-1
        while k<m and v>=0:
            if matrix[k][v] == target:
                return True
            elif matrix[k][v] > target:
                v-=1
            else:
                k+=1
        return False

时间复杂度分析:O(n)

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。