当前位置:网站首页>【Code】剑指offer 04二维数组中的查找
【Code】剑指offer 04二维数组中的查找
2022-07-26 23:04:00 【静静喜欢大白】
目录
1、题目
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例:
现有矩阵 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。
2、解题
首先想到的就是暴力破解
def findNumberIn2DArray(matrix, target):
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j] == target:
return True
return False
def findNumberIn2DArray3(matrix, target):#等价于上面
i,j = 0, 0
while i < len(matrix):
j = 0 #一定要从0开始,否则少遍历结果不对
while j <(len(matrix[0])):
if matrix[i][j] == target:
return True
j = j + 1#缩进一定要遍历中,否则超时报错
i = i + 1
return False
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]
]
print("二维数组行数:", len(matrix))
print("二维数组列数:", len(matrix[0]))
target = 5
res = findNumberIn2DArray(matrix, target)
print(res)
结果
二维数组行数: 5
二维数组列数: 5
True
** Process exited - Return Code: 0 **
Press Enter to exit terminal但是这个复杂度O(NM)
暴力法未利用矩阵 “从上到下递增、从左到右递增” 的特点,显然不是最优解法。
于是可以通过逐渐缩小范围来解决
从数组的一个角(左下角或者右上角开始查找)
右上角:该行最大,该列最小。若矩阵中的数值>目标数,说明目标数在左侧,消除列;若数值<目标数,说明目标数在下面,消除行。
左下角:该列最大,该行最小。若矩阵中的数值>目标数,说明目标数在上面,消除行;若数值<目标数,说明目标数在右侧,消除列。
这种做法好比二叉树搜索:
如下图所示,我们将矩阵逆时针旋转 45° ,并将其转化为图形式,发现其类似于 二叉搜索树 ,即对于每个元素,其左分支元素更小、右分支元素更大。因此,通过从 “根节点” 开始搜索,遇到比 target 大的元素就向左,反之向右,即可找到目标值 target 。
“根节点” 对应的是矩阵的 “左下角” 和 “右上角” 元素,本文称之为 标志数 ,以 matrix 中的 左下角元素 为标志数 flag ,则有:
若 flag > target ,则 target 一定在 flag 所在 行的上方 ,即 flag 所在行可被消去。
若 flag < target ,则 target 一定在 flag 所在 列的右方 ,即 flag 所在列可被消去。算法流程:
从矩阵 matrix 左下角元素(索引设为 (i, j) )开始遍历,并与目标值对比:
- 当 matrix[i][j] > target 时,执行 i-- ,即消去第 i 行元素(因为是左下角(最后一行)开始且要-,所以从初始值为len-1);
- 当 matrix[i][j] < target 时,执行 j++ ,即消去第 j 列元素(因为是左下角(第一列)且要+,所以从初始值为0开始即可);
- 当 matrix[i][j] = target 时,返回 true ,代表找到目标值。
若行索引或列索引越界,则代表矩阵中无目标值,返回 false 。
每轮 i 或 j 移动后,相当于生成了“消去一行(列)的新矩阵”, 索引(i,j) 指向新矩阵的左下角元素(标志数),因此可重复使用以上性质消去行(列)。复杂度分析:
时间复杂度 O(M+N) :其中,N和 M分别为矩阵行数和列数,此算法最多循环 M+N 次。
空间复杂度 O(1) : i, j 指针使用常数大小额外空间。

详细解题思路






def findNumberIn2DArray2(matrix, target):
i, j = len(matrix) - 1, 0 #必须要定义,for就不需要
while i >= 0 and j < len(matrix[0]):
if matrix[i][j] > target:
i -= 1
elif matrix[i][j] < target:
j += 1
else:
return True
return False
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]
]
print("二维数组行数:", len(matrix))
print("二维数组列数:", len(matrix[0]))
target = 5
res = findNumberIn2DArray2(matrix, target)
print(res)
结果
二维数组行数: 5
二维数组列数: 5
True3、参考
LeetCode-Book/sfo_04_find_a_number_in_2d_matrix_s1.py at main · krahets/LeetCode-Book · GitHub
python中遍历二维数组_smartdup的博客-CSDN博客_python遍历二维数组
【python】错误SyntaxError: invalid syntax的解决方法总结_Heaphaestus,RC的博客-CSDN博客_invalid syntax
边栏推荐
- 静态路由基本配置 实现全网可达
- 【洋哥带你玩转线性表(四)——链式队列】
- 有趣的C语言
- OSPF总结(思维导图)
- 【斐波那契数列及螺线 基于C语言】
- 多点双向重发布和路由策略-拓扑实验
- Is it useful to lie down with your eyes closed when you can't sleep?
- Find a specific number in an ordered array
- [brother Yang takes you to play with the linear table (I) - sequence table]
- Array methods and loops in JS
猜你喜欢

勤写标兵——云小井

Hcip bidirectional republication and routing strategy

HCIP第一天静态路由综合实验

Fist guessing applet based on Object-C novice on the road

C language - array, string handler, strlen, strcpy and strncpy, strcat and strncat, StrCmp and strncmp

Risc-v tool chain compilation notes

What is the principle of synchronized lock escalation in multithreading?

Record the nth SQL exception

记录HandsomeBlog的star用户

静态路由基本配置 实现全网可达
随机推荐
On the first day of staying in the blog [for 80000]!
[C language] factorial implementation
NAT network address translation protocol topology experiment
【用C语言绘制直角坐标系】
[draw sherpinski triangle in C language]
What is the principle of synchronized lock escalation in multithreading?
Hcip day 1
C language - value range of data type and basic data type
[brother Yang takes you to play with the linear table (I) - sequence table]
Fist guessing applet based on Object-C novice on the road
LabelImg标注的xml格式转yolov5
离开页面的提示
全连MGRE与星型拓扑MGRE
HCIP-第四天-OSPF路由协议
【洋哥带你玩转线性表(一)——顺序表】
Static routing experiment configuration
Find a specific number in an ordered array
C language - characters and strings, arithmetic operators, type conversions
入住博客第一天【冲八万】!
Golang implements TCP chat room