首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

这周一道算法题(五十六)

2024-12-17 来源:化拓教育网

本周题目难度级别'Medium',使用语言'Python'

题目:给你一个数target及m*n的有序矩阵(从小到大),让你查找target是否在这个矩阵中。eg:矩阵[[1, 3, 5, 7],[10, 11, 16, 20],[23, 30, 34, 50]] & target = 3 返回True

思路:其实思路很简单,就是实现起来有点困难,再次体会到'Talk is cheap,show me the code!'的真谛。说说我的思路吧,我用了两次二分法,先将m*n的矩阵的第一列作为一个数组进行二分查找,确定target所在的行row。然后再次用二分法对row行进行查找,看是否有等于target的数。思路很简单,接下来看代码吧:

class Solution:
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        row = len(matrix)
        #避免为空
        if matrix and matrix[0]:
            left = 0
            right = row-1
            #第一次二分查找确定行
            while (right >= left):
                mid = (left + right) // 2
                if (target < matrix[mid][0]):
                    right = mid - 1
                elif (target > matrix[mid][0]):
                    left = mid + 1
                else: return True
            #因为二分查找出来的其实有不够精确,可能会误差一行,故要判断找出真的一行
            if (target > matrix[mid][0]):result_row = mid
            else: result_row = mid-1
            #重置参数第二次二分查找,即可返回结果
            col = len(matrix[0])
            left = 0
            right = col-1
            while (right >= left):
                mid = (left + right) // 2
                if (target < matrix[result_row][mid]):
                    right = mid - 1
                elif (target > matrix[result_row][mid]):
                    left = mid + 1
                else: return True
            return False
        else: return False

效率还是挺高的,就是感觉代码写的有点长,用到了两次二分查找,但感觉就算把公共部分提出来也省不了几行。。。

版权声明:本文为 Crazy Steven 原创出品,欢迎转载,转载时请注明出处!

显示全文