1. 程式人生 > 其它 >【每日演算法】搜尋二維矩陣

【每日演算法】搜尋二維矩陣

目錄

題目描述


這是 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