LeetCode 74. Search a 2D Matrix

栏目: 编程工具 · 发布时间: 5年前

内容简介:Write an efficient algorithm that searches for a value in an编写一个高效的算法来判断利用矩阵的如下特性:(1)每行中的整数从左到右按升序排列。(2)每行的第一个整数大于前一行的最后一个整数。我们从右上角开始扫描,比较元素与目标值,如果大于目标值,则向下扫描,如果小于则向左扫描,否则返回True。
LeetCode 74. Search a 2D Matrix 题解

题目描述

  • 英文:

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

  • Integers in each row are sorted from left to right.
  • The first integer of each row is greater than the last integer of the previous row.
  • 中文:

编写一个高效的算法来判断 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

题解

  • 题解 1

利用矩阵的如下特性:(1)每行中的整数从左到右按升序排列。(2)每行的第一个整数大于前一行的最后一个整数。我们从右上角开始扫描,比较元素与目标值,如果大于目标值,则向下扫描,如果小于则向左扫描,否则返回True。

class Solution:
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        if len(matrix) == 0:
            return False
        elif len(matrix[0]) == 0:
            return False
        else:
            row = 0
            col = len(matrix[0])-1
            while row < len(matrix) and col >= 0:	# 扫描完毕条件
                if target > matrix[row][col]:	# 目标值大于当前元素
                    row += 1	# 向下移动
                elif target < matrix[row][col]:	# 目标值小于当前元素
                    col -= 1	# 向左移动
                else:
                    return True
            return False
  • 题解 2

使用二分法。先通过比较目标值与每行第一个数组定位目标值在在哪一行,然后锁定某一行后再对那一行进行二分查找。

class Solution:
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        row = len(matrix)
        if row == 0:
            return False
        col = len(matrix[0])
        if col == 0:
            return False
        else:
            # 先定位大致在哪一行
            row_index = row - 1
            for i in range(row):
                if target < matrix[i][0]:
                    row_index = i - 1
                    break
            # 在这一行,再用二分法查找
            left, right = 0, col - 1
            while left <= right:
                mid = int((left + right) / 2)
                if matrix[row_index][mid] == target:
                    return True
                elif matrix[row_index][mid] < target:
                    left = mid + 1  # 在右半部分
                else:
                    right = mid - 1  # 在左半部分
        return False

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

结网@改变世界的互联网产品经理

结网@改变世界的互联网产品经理

王坚 / 人民邮电出版社 / 2013-5-1 / 69.00元

《结网@改变世界的互联网产品经理(修订版)》以创建、发布、推广互联网产品为主线,描述了互联网产品经理的工作内容,以及应对每一部分工作所需的方法和工具。产品经理的工作是围绕用户及具体任务展开的,《结网@改变世界的互联网产品经理(修订版)》给出的丰富案例以及透彻的分析道出了从发现用户到最终满足用户这一过程背后的玄机。新版修改了之前版本中不成熟的地方,强化了章节之间的衔接,解决了前两版中部分章节过于孤立......一起来看看 《结网@改变世界的互联网产品经理》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

URL 编码/解码
URL 编码/解码

URL 编码/解码