leetcode 240:搜索二维矩阵 || python 剑指offer系列 3 二维数组中的查找

leetcode 240:搜索二维矩阵 ||

题目描述

在这里插入图片描述

解法

解法一:暴力法
两个for循环,逐个遍历,找target

解法二:按规律搜索
矩阵的特性很重要啊!!不能白给啦

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。

思路:
刚开始,我想的是从最矩阵中间的元素开始与target比较,借鉴二分搜索的思路,但是…发现只有往左上角走是变小的…就不符合二分法了,不知道 i (行)、j(列)如何改变了。就像下面这个图这样
在这里插入图片描述
所以不能从中间开始区分,只能从角落开始。但是并不是四个角都可以的,看下图,箭头表示数字变大的方向。
在这里插入图片描述
左上角:当行数i增加时,数变大;列数j增大时,数也变大。
右下角:当行数i减小时,数变小;列数j减小时,数也变小。
左下角:当行数i减小时,数变小;列数j增加时,数变大。
右上角:当行数i增加时,数变大;列数j减小时,数变小。

因此,只有左下角、右上角可以,也就是说因为从这两个角出发,能分别通过改变行数i和列数j来控制数变大变小。另外两个角则不能。

我写的是从右上角出发,i=0,j=len(matrix[0])-1,当target大于当前值,则i+1,也就是往下走,当前值变大;
当target小于当前值,则j-1,也就是往左走,当前值变小。直到找到target。

最终如果整个矩阵都遍历完了,说明没找到,返回False.

上代码

class Solution:
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        if not matrix:
            return False
        i = 0
        j = len(matrix[0])-1
        while i<len(matrix) and j>-1:
            if target > matrix[i][j]:
                i += 1
            elif target == matrix[i][j]:
                return True
            else:
                j -= 1
        return False

最坏时间复杂度:O(n2)
总结:也是注重找规律的一题,当题目给出一些特性时,一定要利用到,这些特性就是关键。

发布了28 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/xxx_gt/article/details/104974562
今日推荐