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)
总结:也是注重找规律的一题,当题目给出一些特性时,一定要利用到,这些特性就是关键。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值