【每日演算法】搜尋二維矩陣
阿新 • • 發佈:2021-08-06
目錄
題目描述
這是 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