编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:
1.每行的元素从左到右升序排列。 2. 每列的元素从上到下升序排列。 示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ] 给定 target = 5,返回 true。 给定 target = 20,返回 false。题目思路: 1.排除法:由于给出的矩阵是有序的,从上到下,从左到右依次递增,如果从左上角开始查找元素,发生横着数值增大,竖着走数值也会增大,所以target 在这个## 标题两个方向都会存在。但是,我们要是从右上角和左下角开始走,逐渐缩小范围,就能找到目标元素。
比如从右上角开始走,两种情况: 1.如果当前元素比 target 大,那么当前列的元素都比 target 大,’指针‘就向左移位一个(横坐标 -1 ); 2.如果当前元素比 target 小,那么当前行元素都比 target 小,'指针’下移一位(纵坐标 +1 )。
tip:在编码的过程中要注意数组下标越界的问题。 class Solution(object): #相当于找插入位置 def searchMatrix1(self, matrix, target): rows = len(matrix) if rows == 0: return False cols = len(matrix[0]) if cols == 0 : return False # 起点:右上角 x = 0 y = cols - 1 # 不越界的条件: 行小于等于 row -1 ,列大于等于 0 while x <=row -1 and y >=0: val = matrix[x][y] if val == target: return True elif val > target: y -=1 else : x+=1 return False解法二:根据行列的元素有序,二分法优化搜索 过程:在对角线上迭代,二分搜索行和列,直到对角线的迭代元素用完为止。
class Solution(object): def binary_search(self,matrix,target,start,flag): left = start right = len(matrix[0]) if flag else len(matrix) while left < right: mid = left + (right - left) //2 print(left,right,mid) if flag == True: #对行进行搜索 if matrix[start][mid] == target: return True elif matrix[start][mid] < target : left = mid + 1 else: right = mid else: #对 对角线元素所在的列进行搜索 if matrix[mid][start] == target: return True elif matrix[mid][start] < target: left = mid +1 else: right = mid return False def searchMatrix(self, matrix, target): m = len(matrix) if m == 0: print('1') return False n = len(matrix[0]) if n == 0: print('2') return False for i in range(min(m,n)): row_found = self.binary_search(matrix,target,i,True) col_found = self.binary_search(matrix,target,i,False) if row_found or col_found: return True print('3') return FalseCoder go go go!!!