题目描述:
-
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
输入:
-
输入可能包含多个测试样例,对于每个测试案例,
输入的第一行为两个整数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 ****************************************************************/