1、題目描述
https://leetcode-cn.com/problems/search-a-2d-matrix/
編寫一個高效的算法來判斷 m x n 矩陣中,是否存在一個目標值。
該矩陣具有如下特性:
每行中的整數從左到右按升序排列。 每行的第一個整數大於前一行的最後一個整數(變成了240題的特例)。
通用模板就看 LeetCode240:搜索二維矩陣II https://blog.csdn.net/IOT_victor/article/details/104642324
本題解法在240基礎上加了優化
2、代碼詳解
法一:縮小領域法
因爲每一行遞增,每一列遞增。所以我們可以從右上角往左下角找或者從左下角往右上角找。
每次比較可以排除一行或者一列,時間複雜度爲O(m+n)
class Solution(object):
def searchMatrix(self, matrix, target):
# m * n
m = len(matrix)
if m == 0:
return False
n = len(matrix[0])
# 左下角(必須這麼設置!左下角:最後一行的最小值)從下向上
row = m - 1
col = 0
while row >= 0 and col <= n-1:
# 優化:當前行的最大值 < target
if matrix[row][n-1] < target:
return False
if matrix[row][col] > target:
row -= 1
elif matrix[row][col] < target:
col += 1
else:
return True
return False
# # 右上角(必須這麼設置!右上角:第一行的最大值)從上向下
# row = 0 # 行
# col = n - 1 # 列
# while row <= m-1 and col >= 0:
# # 優化:當前行的最小值 > target
# if matrix[row][0] > target:
# return False
# if matrix[row][col] > target: # 在本行中
# col -= 1
# elif matrix[row][col] < target: # 加行
# row += 1
# else:
# return True
# return False
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
s = Solution()
print(s.searchMatrix(matrix, target))
法二:標準的二分查找模板
將二維矩陣拖爲一維矩陣,然後就是一個有序的一維數組了,利用二分查找就行