在行列都排好序的矩阵中找指定
题目描述
给定一个 N × M N \times M N×M 的整型矩阵matrix和一个整数 K K K ,matrix的每一行和每一列都是排好序的。
实现一个函数,判断 K K K 是否在matrix中。
[要求]
时间复杂度为 O ( N + M ) O(N + M) O(N+M) ,额外的空间复杂度为 O ( 1 ) O(1) O(1) 。
输入描述:
第一行有三个整数N, M, K
接下来N行,每行M个整数为输入的矩阵
输出描述:
若K存在于矩阵中输出"Yes",否则输出"No"
示例1
输入
2 4 5
1 2 3 4
2 4 5 6
输出
Yes
示例2
输入
2 4 233
1 2 3 4
2 4 5 6
输出
No
备注:
1 ≤ N , M ≤ 1000 1 \leq N,M \leq 1000 1≤N,M≤1000
0 ≤ K , 矩阵中的数 ≤ 1 0 9 0 \leq K, \text{矩阵中的数} \leq 10^9 0≤K,矩阵中的数≤109
解法:
我们已经知道矩阵每行和每列都是非递减排列,于是我们可以利用这个特性进行遍历:
1:从右上角开始遍历,假设当前遍历到第 r o w row row 行、第 c o l col col列,如果当前位置元素小于 K K K ,
说明该行该列之前的所有元素均小于 K K K ,所以 r o w row row++;
2:否则的话,若当前位置元素大于 K K K ,也就是说明该列及下面的元素均大于 K K K ,所以 c o l col col– ;
3:排除上面两种情况,则找到该元素。
代码:
#include <cstdio>
using namespace std;
const int N = 1000;
int n, m, k;
int a[N][N];
int main(void) {
scanf("%d%d%d", &n, &m, &k);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
scanf("%d", a[i] + j);
}
}
bool flag = false;
for (int i = 0, j = m - 1; i < n && j >= 0;) {
if (a[i][j] < k) ++i;
else if (a[i][j] > k) --j;
else {
flag = true;
break;
}
}
puts(flag ? "Yes" : "No");
return 0;
}