面試題3:二維數組中的查找

題目描述:online judge
在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
輸入:
輸入可能包含多個測試樣例,對於每個測試案例,
輸入的第一行爲兩個整數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二維數組化爲一維速度,計算。加快運算速度。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章