面试题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二维数组化为一维速度,计算。加快运算速度。


你可能感兴趣的:(二分查找,算法,查找,面试题,剑指offer)