力扣刷题(十五)--搜索二维矩阵--python语言描述--searchMatrix

开头语:
这篇总结建议和专栏–力扣刷题(十六)还有–剑指刷题(一)一起阅读,总结。因为力扣刷题(十六)是力扣刷题(十五)的进阶版。十五的条件更苛刻且特殊,因为它规定了每行的第一个整数大于前一行的最后一个整数。而十六并没有规定两行之间彼此的关系。

题目描述:
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。

示例 1:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
输出: true

示例 2:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 13
输出: false

思路:
这里我们直接用最一般的思路去求解这道题目。题目中需要判断是否存在一个目标值,常见的方法是想到二分法,从矩阵的最中间位置取值和target比较,决定接下来运动的方向。但是”矩阵“、”字符串“、”数组“这种问题其实有一个共性思路就是从最后一个位置出发(比如数组,大多数人都是从左往右查找。但其实可以逆向思维从最后往前做往往事半功倍。)。这道题就是如此,我们可以:

  1. 从右上角开始取值(记为A)与target比较(自然而然也可以从左下角开始取值与target比较),如果 A > target,那么我们就可以不用判断同列A下面的数了,因为同列只会越来越大,而这里的A已经是同列里最小的了,所以不用往下走了。因此我们要做的操作就是”删除整列";
  2. 如果 A < target,那么我们就可以不用判断同行A旁边的数了。因为同行是递增的关系,如果最右的A都比target小,那么A左边的数也一定都比target小。因此没有比较的必要,我们要做的操作就是”删除整行";
  3. 依次类推,直至找到符合条件的A,并输出true。如果没有找到,则输出false

测试用例注意:

  1. 空矩阵
  2. 行向量、列向量;(这个坑主要是如果行索引i由列的最大长度控制,那么就会超出索引长度;因此必须行索引由行的最大长度控制;列索引由列的最大长度控制)
  3. 思想上用的是”删除“,但是如果你用 del 或者pop删除的话会有问题就是索引比较麻烦,因此要变通!真正实现的时候我们是通过让行索引加一或者列索引减一去做,这样其实就间接达到了”删除“的目的,还不会导致索引混乱!!

通用code:

class Solution(object):
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        i = 0
        if matrix:
            j = len(matrix[0]) - 1
        else:
            return False
        
        while j >= 0 and i <= len(matrix)-1:            
          
            if matrix[i][j] > target:
                j -= 1
               
            elif matrix[i][j] < target:           
                    i += 1
               
            else:
                return True   
            
        return False
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值