标签:
Search a 2D Matrix II:
python学了还么两周可能有些地方写的很新手大家不要笑我
解题思路:
首先当数组为1维数组时if in 直接查找即可
当为 m x n 维数组时:
matrix为行增列增的有序矩阵 所以对行和列采用折半查找,即可判断出值所在的新的矩阵范围,一步步缩小,若存在则某一次的行折半或者列折半肯定会遍历到,否则不存在于矩阵中
每一行的第一个元素为最小值,每一列最后一个元素为最大值 若此行的第一个元素比target要大,那肯定在行号小于此行的行中,若此列的最后一个元素比target还要小,那肯定在列号大于此列的列中,重新划定缩小矩阵的范围再次进行查询即可,比如查找15


‘‘‘
Search a 2D Matrix II
‘‘‘
class Solution:
# @param {integer[][]} matrix
# @param {integer} target
# @return {boolean}
# @author sallency 32448732
# @date 2015/07/27
def searchMatrix(self, matrix, target):
#matrix rows and cols
rows = len(matrix)
#如果是二维数组
if (type(matrix[0]) == list) :
cols = len(matrix[0])
if (isInMatrix(matrix, rows - 1, 0, target)) :
return True
else :
return False
#如果是一位数组直接用遍历
else :
if target in matrix :
return True
else :
return False
‘‘‘
isInMatrix用来判断target是否在matrix中,因为matrix是行增列增的有序矩阵
用折半查找先找出包含target的行边界,再在新的范围内排除列边界
逐渐缩小范围,若target存在matrix中,在某次新的边界判定划分时会被遍历到
否则最终范围为0未找到
@param matrix 查找的matrix主体
@param row_border col_border 当前范围查询的新边界
@target 查找的target
‘‘‘
def isInMatrix(matrix, row_border, col_border, target):
rows_list = []
#from 0 to row_border
for i in range(row_border + 1):
#列标为cols_border
rows_list.append(matrix[i][col_border])
rows_l, rows_r = 0, row_border
#binary search to find the row gt target first
while (rows_l <= rows_r) :
rows_avg = (rows_l + rows_r) / 2
if (rows_list[rows_avg] == target) :
return True
elif (rows_list[rows_avg] > target) :
#row_avg-1 is the value border of target
#overflow
if (rows_avg - 1 < 0) :
return False
#new range row border
if (rows_list[rows_avg - 1] < target) :
row_border = rows_avg - 1
break
else :
rows_r = rows_avg - 1
else :
rows_l = rows_avg + 1
if (rows_l > rows_r) :
row_border = rows_l - 1
#the new matrix row range is from 0 to row_border
#binary search to find the col gt target first
cols_list = []
for j in range(col_border, len(matrix[0])):
cols_list.append(matrix[row_border][j])
cols_l, cols_r = col_border, len(matrix[0]) - 1
while (cols_l <= cols_r) :
cols_avg = (cols_l + cols_r) / 2
if (matrix[row_border][cols_avg] == target) :
return True
elif (matrix[row_border][cols_avg] > target) :
#overflow
if (cols_avg - 1 < 0) :
return False
#new range col border
if (matrix[row_border][cols_avg - 1] < target) :
col_border = cols_avg
break
else :
cols_r = cols_avg - 1
else :
cols_l = cols_avg + 1
if (cols_l > cols_r) :
col_border = cols_l
#the new matrix col range is from col_border to max_left
#if overflow
if (row_border > len(matrix) - 1 or col_border > len(matrix[0]) - 1) :
return False
else :
return isInMatrix(matrix, row_border, col_border, target)
标签:
原文地址:http://my.oschina.net/sallency/blog/484371