leetcode-240. 搜索二维矩阵 II


title: leetcode-240. 搜索二维矩阵 II
date: 2019-9-21 15:00:25
comments: true
categories: “leetcode”
tags:
- leetcode 中等难度

240. 搜索二维矩阵 II

题目描述

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:

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

现有矩阵 matrix 如下:

[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]

给定 target = 5,返回 true。
给定 target = 20,返回 false。

解答

思路一

思路也就是每次遍历首行和首列,如果矩阵为空或者矩阵首个元素大于target就返回False,如果在首行或者首列中找到了,就返回True。
当然,边界条件比较多,我是提交了几次,然后处理的边界。代码如下:

class Solution:
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        # 暴力法
        # 预防[[]]这种情况
        if len(matrix) == 0:
            return False
        # [[],[1,2,3]] 预防这种情况的矩阵
        if len(matrix[0]) == 0:
            subMatrix = []
            for i in range(1, len(matrix)):  # 不包括首行
                temp = matrix[i][1:]
                if len(temp) > 0:
                    subMatrix.append(temp)
            return self.searchMatrix(subMatrix, target)
        # 找顶部的一行和最左边的一列
        for i in matrix[0]:
            if i == target:
                return True
        for i in range(len(matrix)):
            print(matrix[i][0], target)
            if matrix[i][0] == target:
                return True
        # 截取矩阵,也就是去掉第一行、第一列后的矩阵
        subMatrix = []
        for i in range(1, len(matrix)): # 不包括首行
            temp = matrix[i][1:]
            if len(temp) > 0:
                subMatrix.append(temp)
        # 边界条件 ①矩阵为空,没找到,就返回False
        if len(subMatrix) == 0:
            return False
        # 边界条件 ②矩阵的第一个元素大于target,必然返回False
        elif subMatrix[0][0] > target:
            return False
        return self.searchMatrix(subMatrix, target)

结果:
在这里插入图片描述

思路二

当然还有更加暴力的解法,因为是矩阵,不妨一个元素一个元素的取出来,然后判断。

class Solution:
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        for row in matrix: # row
            for ele in row:
                if ele == target:
                    return True
        return False

我们看结果:

在这里插入图片描述

两种方法对比

在这里插入图片描述
虽然前一种暴力法,使用了数据本身有序的特点,做了边界处理,避免了额外的计算。
但是,由于使用的是递归的访问方式,也就导致了对内存消耗的加剧。
这里也不难记起,以前数据结构中学过的:“递归调用,最好用栈来改进。能用循环解决的就不要用递归。”

思路三

由于这个题目所处的位置是“分治法”,故而也企图找到一种思路用分治来解决。
这里我画了一个简略的图来解释这个过程:
在这里插入图片描述
但是实现比较复杂,这里就不写代码实现了。

思路四

在leetcode网站的解答区,看见了这么一个思路,如下图:
在这里插入图片描述
在这里插入图片描述

相信,看图也就明白了这个思路的巧妙之处!
代码实现也比较简单:

class Solution:
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]![\]
        ](https://img-blog.csdnimg.cn/20191019184658105.png):type target: int
        :rtype: bool
        """
        # 以左下角开始
        if len(matrix) == 0:
            return False
        row = len(matrix)
        col = len(matrix[0])
        finded = False
        i, j = row - 1, 0
        while not finded and (i >= 0 and j < col):
            if matrix[i][j] == target:
                return True
            elif matrix[i][j] > target:
                i = i - 1
            elif matrix[i][j] < target:
                j = j + 1
        return False

结果:
在这里插入图片描述


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-a-2d-matrix-ii

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦否

文章对你有用?不妨打赏一毛两毛

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值