LeetCode50天刷题计划(Day 40 —搜索二维矩阵(8.00-9.40)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

二分查找还需要再练习

一、题目

搜索二维矩阵

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。

示例

示例 1:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

示例 2:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

提示

m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-104 <= matrix[i][j], target <= 104

二、思路

看到有序序列的查找问题首先想到二分查找
首先以每一行的第一列为一组,查找目标值是哪一行的,因为条件是 while(first<=last):,因此最后的结果出循环后一定是last=first-1
当排除掉比第一个还小或比最后一个还大的情况,last所指向的就是目标行的index。最后在行内再进行一次二分查找即可
时间复杂度O(logn)
空间复杂度O(1)

三、代码

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        #二维的一个二分查找,
        #首先,每次查找第一列+最后一个值(即判断哪一行)直到两个指针指向同一行
        first,last = 0,len(matrix)-1
        while(first<=last):
            mid=(first+last)//2
            if(matrix[mid][0] == target):
                return True
            elif(matrix[mid][0] > target):
                last=mid-1
            else:
                first=mid+1
        #print(first,last)

        if(last<0 or first>len(matrix)-1 and target>matrix[-1][-1]): #比第一个还小或比最后一个还大
            return False
        
        i=last #在last行继续二分查找
        first,last=0,len(matrix[0])-1
        while(first<=last):
            mid=(first+last)//2
            if(matrix[i][mid]==target):
                return True
            elif(matrix[i][mid]>target):
                last=mid-1
            else:
                first=mid+1
        return False      

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值