勇闯算法-在行列都排好序的矩阵中找指定的数
题目来源:《程序员代码面试指南-IT名企算法与数据结构最优解》-左程云著
牛客网在线OJ
系统地址:传送门
题目描述
给定一个N × M
的整型矩阵matrix
和一个整数K
,matrix
的每一行每一列都是排好序的。实现一个函数,判断K
是否在matrix
中。
要求:
时间复杂度为
O(N + M)
,额外空间复杂度为O(1)
。
备注:
1 ⩽ N, M ⩽1000
0 ⩽ K, 矩阵中的数 ⩽ 10^9^
输入描述
第一行有三个整数N
,M
,K
;
接下来N
行,每行M
个整数为输入的矩阵。
输出描述
若K
存在于矩阵中输出"Yes"
,否则输出"No"
。
示例
示例一
输入:
1 | 2 4 5 |
输出:
1 | Yes |
示例二
输入:
1 | 2 4 233 |
输出:
1 | No |
思考
由于矩阵中的行和列都是排好序的,我们可以知道最后一列是每一行的最大值,最后一行是每一列的最大值。整个矩阵的最大值在右下角。
要想减少时间复杂度,我们必须能够快速排除某些行或列,基于最后一列或行是每一行或列的最大值的特点,我们可以从矩阵右上角或左下角开始查找,如果不是指定的数,我们就可以排除掉一行或一列了。
算法思路
思路一:从矩阵右上角开始查找
- 从矩阵最右上角的数开始查找(
row=0,col=M-1
:第0
行,第M-1
列)。 - 比较当前数
matrix[row][col]
与K
的关系:
- 如果等于
K
,则找到了,返回"Yes"
,整个过程结束。 - 如果大于
K
,则该列被排除,令col=col-1
,重复步骤2
。 - 如果小于
K
,则该行被排除,令row=row+1
,重复步骤2
。
- 如果找到越界都没有找到与
K
相等的数,则返回"No"
,整个过程结束。
思路二:从矩阵左下角开始查找
- 从矩阵最左上角的数开始查找(
row=N-1,col=0
:第N-1
行,第0
列)。 - 比较当前数
matrix[row][col]
与K
的关系:
- 如果等于
K
,则找到了,返回"Yes"
,整个过程结束。 - 如果大于
K
,则该行被排除,令row=row-1
,重复步骤2
。 - 如果小于
K
,则该列被排除,令col=col+1
,重复步骤2
。
- 如果找到越界都没有找到与
K
相等的数,则返回"No"
,整个过程结束。
代码实现(Java
)
1 | import java.util.Scanner; |
-------------有过牵挂了无牵挂-------------
欢迎关注微信公众号【打工这件小事】~
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 打工这件小事!
评论