• 二维数组搜索--九度1384


    题目描述:

    在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    输入:

    输入可能包含多个测试样例,对于每个测试案例,

    输入的第一行为两个整数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
    
    第一种思路:对每一行使用二叉查找,时间复杂度为O(nlogn),二叉查找的时间复杂度是O(lg n).
    第二种思路:从右上角的元素开始查找,因为该数组右上角的元素是同一行中最大的,是同一列中最小的。因此,如果这个元素A比要查找的元素B大,那么A所在的列中的元素肯定都比B大,因此A所在的列中的元素就可以不需要再比较了。如果A比B小,则A所在的行中的元素都比B小,那么就不需要再比较A所在的行的元素了。这样不断缩小比较范围。
    第一种思路代码:
    #include<stdio.h>
    #include<stdlib.h>
    #define GET_ARRAY_LEN(array,len){ len = (sizeof(array)/sizeof(array[0]));}
     
    /*
        数组从小到大排序,从中二叉查找元素
    */
    bool binarySearch(int array[],int len,int element){
     
            int low,high,mid;       
            low = 0;
            high = len - 1;
            if(array[0]>element){
                return false;
            }
     
            while(low <= high){
                            mid = (low+high)/2;
                            if(array[mid]== element){
                                            return true;               
                            }else if(array[mid] < element){
                                  low = mid + 1;
                            }else{
                                  high = mid - 1;
                            }
            }
             return false;            
    }
     
    int main(){
        int m,n;
        int i,j;
        int element;
        int** array;
     
        /*
        接收输入,输入的格式为:
        3 3
        5
        1 2 3
        4 5 6
        7 8 9
        */
        int low,high,mid;
        int* tmp;
        bool hasFound =false;
        while(scanf("%d%d%d",&m,&n,&element)!=EOF){
            /*scanf("%d",&element);*/
            array = (int **)malloc(sizeof(int *)*m);
            tmp = (int *)malloc(sizeof(int )*m);
            for(i=0;i<m;i++){
                array[i]= (int *)malloc(sizeof(int)*n);
            }
            for(i =0;i<m;i++){
                for(j =0;j<n;j++){
                    scanf("%d",&array[i][j]);
                }
            }
            low = 0;
            high = n;
            hasFound = false;
            for(i=0;i<m;i++){
                 
                hasFound = binarySearch(array[i],n,element);
                if(hasFound){
                    printf("Yes
    ");
                    break;
                }
            }
            if(!hasFound){
                printf("No
    ");
            }
    }
         return 0;
    }
     
    /**************************************************************
        Problem: 1384
        User: jingxmu
        Language: C++
        Result: Accepted
        Time:690 ms
        Memory:8808 kb
    ****************************************************************/

    第二种思路代码:

    #include<stdio.h>
    #define N 1001
    int array[N][N];
     
    bool search(int a[N][N],int m,int n,int element){
        int column = n-1;
        int row = 0;
        while(column >=0 && row <m){
            if(a[row][column]==element){
                return true;
            }else if(a[row][column]<element){
                row++;
            }else{
                column--;
            }
        }
        return false;
    }
      
      
    int main(){
        int m,n;
        int i,j;
        int element;
      
        /*
        接收输入,输入的格式为:
        3 3
        5
        1 2 3
        4 5 6
        7 8 9
        */
        bool hasFound =false;
        for(i=0;i<N;i++){
            for(j=0;j<N;j++){
                array[i][j]=0;
            }
        }
        while(scanf("%d%d%d",&m,&n,&element)!=EOF){
            /*scanf("%d",&element);*/
            for(i =0;i<m;i++){
     
                for(j =0;j<n;j++){
                    scanf("%d",&array[i][j]);
                }
            }
            hasFound = search(array,m,n,element);
            if(hasFound){
                printf("Yes
    ");
            }else{
                printf("No
    ");
            }
        }
        return 0;
    }
    /**************************************************************
        Problem: 1384
        User: jingxmu
        Language: C++
        Result: Accepted
        Time:680 ms
        Memory:4936 kb
    ****************************************************************/
  • 相关阅读:
    python之各种包
    正则表达式
    import/模块的导入
    迭代器/可迭代对象/生成器
    Day2 列表list
    Day1 字符串格式化
    Day1 字符编码及编码函数
    Python 学习笔记 之 随着学习不断更新的Python特性搜集
    Day1 input&print
    Newtonsoft.Json日期转换
  • 原文地址:https://www.cnblogs.com/jing77jing/p/3823903.html
Copyright © 2020-2023  润新知