码迷,mamicode.com
首页 > 其他好文 > 详细

Search a 2D Matrix II【原创】

时间:2015-07-27 19:16:19      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

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)


Search a 2D Matrix II【原创】

标签:

原文地址:http://my.oschina.net/sallency/blog/484371

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!