题目描述:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
-
输入:
-
输入可能包含多个测试样例,对于每个测试案例,
输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数。
输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字。
接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
-
输出:
-
对应每个测试案例,
输出”Yes”代表在二维数组中找到了数字t。
输出”No”代表在二维数组中没有找到数字t。
-
样例输入:
-
3 3 5 1 2 3 4 5 6 7 8 9 3 3 1 2 3 4 5 6 7 8 9 10 3 3 12 2 3 4 5 6 7 8 9 10
-
样例输出:
-
Yes No No
题意;
查找数组中某个元素是否存在
解题:
依次找肯定超时,根据从左到右,从上到下的顺序,可以从矩阵的右上角开始查找,
设矩阵为m * n, 右上角下标为(1,n),当t(查找元素)大于(1,n)时,根据排序规律(从上到下,从左到右),t如果存在一定在(1,n)的下一行;如果小于(1,n),根据规律,t如果存在,一定在(1,n)的左边;依次类推。
注意:
不清楚用cin为毛会超时,用scanf()读入
代码如下:
/***********************************
Author:
Date: 2014-11-01
Mail:
Description: 二维数组中的查找
/**********************************/
#include<iostream>
#include<cstdio>
using namespace std;
const int ROW = 1000 + 5;
const int COL = 1000 + 5;
int matrix[ROW][COL];
int m,n,t;
bool search_t(int t)
{
int i, j;
i = 1; j = n;
while(i <= m && j>=1 )
{
if(t > matrix[i][j]) { i++; } //往下走
else if(t < matrix[i][j]) { j--; } //往左走
else if(t == matrix[i][j]) return true;
}
return false;
}
int main()
{
//freopen("572.txt","r",stdin);
while(scanf("%d %d",&m,&n) != EOF) //while(cin>>m>>n)
{
cin>>t;
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
//cin>>matrix[i][j];
scanf("%d",&matrix[i][j]);
if(search_t(t)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}