题目描述

这是 LeetCode 上的 74.搜索二维矩阵

难度为 【中等】

编写一个高效的算法来判断 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
-10^4 <= matrix[i][j], target <= 10^4
分析题目要求

两种解法,一种暴力解法,直接逐个判断是否与target相等,相等则直接返回True,AC 24 ms

因为矩阵从左到右递增,每行的第一个整数大于前一行的最后一个整数,所以可以先找到target属于哪一行

for i in range(行):
    if target==matrix[i][-1]:
        return True
    elif target<matrix[i][-1]:
        break

逐行与最后一个数字进行比较,如果小于最后一个数字,则target可能就会在这此行,有二维转换为一维的

然后再用二分查找法在那行里面查找target

left,right=0,len(matrix[0])-1
nums=matrix[i]#target的可能存在的行,
while left<=right:
    mid=(left+right)//2
    if nums[mid]==target: return True
    if nums[mid]>target:
        right=mid-1:
    else:
        left=mid+1
代码实现
class Solution(object):
    def searchMatrix(self, matrix, target):
        hang=len(matrix)
        lie=len(matrix[0])
        for i in range(hang):
            if matrix[i][-1]==target:
                return True
            elif target<matrix[i][-1]:#找到第一个小于的行
                break
        left,right=0,lie-1
        
        nums=matrix[i]
        # print(nums)
        while left<=right:
            mid=(left+right)//2
            if nums[mid]==target:
                return True
            if nums[mid]<target:
                left=mid+1
            else:
                right=mid-1
        return False