/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param mat int整型二维数组 * @param matRowLen int mat数组行数 * @param matColLen int* mat数组列数 * @param n int整型 * @param m int整型 * @param x int整型 * @return int整型一维数组 * @return int* returnSize 返回数组行数 */ int* findElement(int** mat, int matRowLen, int* matColLen, int n, int m, int x, int* returnSize ) { // write code here *returnSize=2; int i=0,j=0,low=0,high=0,mid=(low+high)/2; int *returnarray=NULL; returnarray=malloc(sizeof(int)*2); //申请返回数组 high=n-1; while(low<=high){ //0列找最大可能的行,小于(x,0),x行及后面都大于查找元素 mid=(low+high)/2; if(x<mat[mid][0]){ high=mid-1; continue; } else if(x==mat[mid][0]){ returnarray[0]=mid; returnarray[1]=0; return returnarray; } else{ break; } } while(low<=high){ //m-1列找最小可能的行,查找值大于(y,m-1)的必定大于y行前面的 mid=(low+high)/2; if(x>mat[mid][m-1]){ low=mid+1; continue; } else if(x==mat[mid][m-1]){ returnarray[0]=mid; returnarray[1]=m-1; return returnarray; } else{ break; } } int r=0,l=0; for(i=low;i<=high;i++){ //两个行之间,每行用二分查找,是的话直接返回,否则下一行 r=m-1;l=0; while(l<=r){ mid=(r+l)/2; if(x<mat[i][mid]){ r=mid-1; } else if(x>mat[i][mid]){ l=mid+1; } else { returnarray[0]=i; returnarray[1]=mid; return returnarray; } } } returnarray[1]=high; //这里没啥用 return returnarray; //本题没有考虑找不到,这里随便返回 }