在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
輸入:
輸入可能包含多個測試樣例,對於每個測試案例,
輸入的第一行爲兩個整數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
java代碼:
/*
*@declaration 二維數組中的查找
* @author 賽俠
* [email protected] http://blog.csdn.net/lvsaixia
* @version:2014-9-9 time:20 :00
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
public class Problem_03 {
public static void main(String[] args) {
int n;
int m;
int t;
int []matric;
StreamTokenizer in = new StreamTokenizer(new BufferedReader(
new InputStreamReader(System.in)));
try {
while(in.nextToken() != StreamTokenizer.TT_EOF){
m = (int)in.nval;
in.nextToken();
n = (int)in.nval;
in.nextToken();
t =(int)in.nval;;
matric = new int[m*n];
if(!(0 < m && m <= 1000 && 0 < n && n <= 1000 && 0 < t && t <= 1000000 )){
System.out.println("please input right number m, n or t");
}else{
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++){
in.nextToken();
matric[i*n + j] = (int)in.nval;
}
}
boolean flag = find(matric,t,m,n);
if(flag == true){
System.out.println("Yes");
}else{
System.out.println("No");
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static boolean find(int []matric, int value,int m, int n){
boolean flag = false;
int mrow = 0;
int ncolumn = n-1;
while(mrow < m && ncolumn >= 0){
if(matric[mrow * n + ncolumn] == value){
flag = true;
break;
}else if( matric[mrow * n + ncolumn] > value){
ncolumn--;
}else{
mrow++;
}
}
return flag;
}
}
C++代碼:
#include <cstdio>
const int MAX_SIZE = 1005;
int Mtrx[MAX_SIZE][MAX_SIZE];
bool search(int m, int n, int val)
{
int r = 0;
int c = n - 1;
while (true) {
if (r >= m || c < 0) break;
if (Mtrx[r][c] == val) return true;
else if (Mtrx[r][c] > val) c --;
else r ++;
}
return false;
}
int main()
{
int m, n;
int val;
while (scanf("%d%d%d", &m, &n, &val) != EOF) {
for (int i = 0; i < m; i ++) {
for (int j = 0; j < n; j ++) {
scanf("%d", &Mtrx[i][j]);
}
}
if (search(m, n, val)) printf("Yes\n");
else printf("No\n");
}
return 0;
}
C語言:
#include<stdio.h>
#include<stdlib.h>
void twoD_search(int **p,int N,int M,int F)
{
int i=N-1,j=0;
while(i>=0&&j<M)
{
if(p[i][j]>F)
--i;
else if(p[i][j]<F)
++j;
else
{
printf("Yes\n");
return;
}
}
printf("No\n");
}
int main()
{
int N=0,M=0,F=0;
while(scanf("%d %d",&N,&M)==2)
{
int **p=(int **)malloc(N*sizeof(int *));
int i,j;
for(i=0;i<N;++i)
*(p+i)=(int *)malloc(M*sizeof(int));
scanf("%d",&F);
for(i=0;i<N;++i)
{
for(j=0;j<M;++j)
{
scanf("%d",(*(p+i)+j));
}
}
twoD_search(p,N,M,F);
}
return 0;
}
1)輸入輸出的流,我採用scanner時間超出,然後採用字節流滿足時間上的條件。
2)java二維數組化爲一維速度,計算。加快運算速度。