leetcode240——搜索二维矩阵(medium)
一、题目描述
编写一个高效的算法来搜索 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。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-a-2d-matrix-ii
二、题解
方法一:暴力搜索法
方法一最容易想到,直接使用两个for循环遍历矩阵,当遇到与target相等的值时直接返回True即可。此法显然不是出题人想要的结果。
完成时间:2020.05.07
class Solution:
def searchMatrix(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: bool
"""
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j] == target:
return True
return False
方法一使用了两趟循环:
时间复杂度:\(O(m * n)\) ,\(m\)指的是矩阵行数,\(n\)指的是矩阵列数。
空间复杂度:\(O(1)\)。
方法二:二分查找
方法二是对方法一的优化。由于矩阵的行和列都已经排好序,那么可以利用二分查找加快目标值的查找速度。具体做法是当按行遍历矩阵时,使用二分查找法对每行进行查找。
注意:
- 二分查找算法里面有很多细节需要注意,不然极容易出错。
完成时间:2020.05.09
class Solution:
def searchMatrix(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: bool
"""
# 矩阵为空,直接返回False
if not matrix:
return False
rows = len(matrix)
columns = len(matrix[0])
for i in range(rows):
left = 0
right = columns - 1 # 注意
while left <= right: # 注意要带等号,不然当数组只有一个值时,可能会漏掉结果
mid = (left + right) // 2
if matrix[i][mid] > target:
right = mid - 1
elif matrix[i][mid] == target:
return True
elif matrix[i][mid] < target:
left = mid + 1
return False
方法二使用了两趟循环:
时间复杂度:for循环的时间复杂度为\(O(m)\) ,\(m\)指的是矩阵行数,while循环的时间复杂度为 \(O(\log_{2}n)\),n为矩阵的列数,所以总的时间复杂度为\(O(m*\log_{2}n)\);
空间复杂度:\(O(1)\)。
方法三:利用本题矩阵的特点
既然题目告诉我们矩阵每行的元素从左到右升序排列,每列的元素从上到下升序排列,那么我们可以利用这一特性来巧妙解题。
- 首先设置变量row表示行标,col表示列标,将row的初始值设为0,表示第一行,将col的初始值设为矩阵最后一列的下标;
- 然后使用一个while循环遍历矩阵,若matrix[row][col] > target成立时,说明当前值比目标值target大,列标col需要左移来找到更小的值与target相比较;若matrix[row][col] < target成立时,说明当前值比目标值target小,行标row需要下移来找到更大的值与target相比较;若matrix[row][col] == target成立时,说明找到了目标值target,直接返回True即可;
- 最后,若遍历结束仍然没有找到目标值target,说明矩阵中不存在目标值taregt,返回False即可。
注意:
- 与目标值比较的初始值选取的位置必须在矩阵的左下角和右上角处
完成时间:2020.05.07
class Solution:
def searchMatrix(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: bool
"""
if not matrix:
return False
row, col = 0, len(matrix[0]) - 1
while row < len(matrix) and col >= 0:
if matrix[row][col] > target:
col -= 1
elif matrix[row][col] < target:
row += 1
else:
return True
return False
方法三使用了一趟循环:
时间复杂度:\(O(m + n)\) ,\(m\)指的是矩阵行数,\(n\)指的是矩阵列数。row的最大值不超过矩阵行数m,col的最大值不超过矩阵列数n。
空间复杂度:\(O(1)\)。
leetcode240——搜索二维矩阵(medium)的更多相关文章
- leetcode-240搜索二维矩阵II
搜索二维矩阵II class Solution: def searchMatrix(self, matrix, target): """ :type matrix: Li ...
- leetcode240 搜索二维矩阵 II
题目: 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有矩阵 ma ...
- [Swift]LeetCode240. 搜索二维矩阵 II | Search a 2D Matrix II
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- lintcode:搜索二维矩阵II
题目 搜索二维矩阵 II 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没 ...
- lintcode :搜索二维矩阵
题目: 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每行的第一个数大于上一行的最后一个整数. 样例 考虑下列矩阵: [ [1 ...
- LintCode-38.搜索二维矩阵 II
搜索二维矩阵 II 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没有重复 ...
- LeetCode74.搜索二维矩阵
74.搜索二维矩阵 描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 示 ...
- LeetCode:搜索二维矩阵【74】
LeetCode:搜索二维矩阵[74] 题目描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的 ...
- Leetcode 240.搜索二维矩阵II
搜索二维矩阵II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有 ...
随机推荐
- EFCore.Sharding(EFCore开源分表框架)
EFCore.Sharding(EFCore开源分表框架) 简介 引言 开始 准备 配置 使用 按时间自动分表 性能测试 其它简单操作(非Sharing) 总结 简介 本框架旨在为EF Core提供S ...
- python基础:如何使用python pandas将DataFrame转换为dict
之前在知乎上看到有网友提问,如何将DataFrame转换为dict,专门研究了一下,pandas在0.21.0版本中是提供了这个方法的.下面一起学习一下,通过调用help方法,该方法只需传入一个参数, ...
- 10.添加script标签,判断onload是否完成
class Tools { static loadScript(url, callback) { let old_script = document.getElementById(url); if ( ...
- 2020i春秋新春战疫
简单的招聘系统 登陆这里就可以注入 查询这里也可以注入 从登陆这里注入把 爆破数据库名 爆破表名 列名 flag 就很奇怪跑出来的东西 重开容器跑一遍列,估计是flaaag.后面可能是发生了502 再 ...
- 女屌丝前端逆袭记(一)之浅谈float
提到前端,相信作为开发者的你或是正在看这篇文章的你并不陌生.前端可以说是直接与用户打交道的一个端口,不论是页面前端亦或是后端界面的前端,都是直接与用户对接的,因此前端设计对于一个网站或管理系统,都是至 ...
- Java 网络编程 --基于UDP实现一对一聊天功能
UDP 基本流程: UDP发送端基本流程: 1.使用DatagramSocket 指定端口 创建发送端 2.准备数据 一定转成字节数组 3. 封装成DatagramPacket 包裹,需要指定目的地 ...
- Zookeepe的安装和集群的配置
Zookeepe的安装和集群的配置 一.Zookeeper的简介 Zookeeper是个框架 二.Zookeeper在Linux上安装 官方提供的下载服务器 地址1:http://mirror.bit ...
- 一个令人兴奋的ES6星特性-结构赋值
学完了前4节,今天我给大家带来的是一个令人兴奋的特性:解构赋值.这个章节代码片段有点偏多,不过可以放心,一点都不烧脑,还是老样子:简单易懂. 什么是解构赋值 按照一贯的套路,接下来的内容是解释:什么是 ...
- Apache Rewrite实现URL的跳转和域名跳转
Apache Rewrite实现URL的跳转和域名跳转 Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言.可基 于服务器级的(httpd.conf)和目录级的 (.h ...
- CodeForces 674C Levels and Regions
#include<bits/stdc++.h> using namespace std; const int maxn=2e5+5; int N,K,head,tair; int q[ma ...