题目
给定整型数组B[0 , ... , M][0 , ... , N]。已知B中数据在每一维方向上都按从小到大的次序排列,且整型变量k在B中存在。设计一个程序段,找出一对满足B[i][j]=k的i和j值,找到后输出i和j的值,要求比较次数不超过M+N。
分析
由于在二维数组中每一维的方向上的数据都是按从小到大的次序排列,以下图为例,比较序列为6、11、16、15,也才比较4次,小于M+N=7。
代码
核心代码:
/* 查找关键字k */
/* B[][maxSize]指的是要查找二维数组;m指的是数组行数;n指的是数组列数;k指的是要查找的关键字 */
void findK(int B[][maxSize],int m,int n,int k){
int i=0,j=n-1;
while(B[i][j]!=k){
if(B[i][j]<k){
i++;
}else{
j--;
}
}
printf("%d,%d",i,j);
}
完整代码:
#include<stdio.h>
#include<stdlib.h>
#define maxSize 10
/* 查找关键字k */
/* B[][maxSize]指的是要查找二维数组;m指的是数组行数;n指的是数组列数;k指的是要查找的关键字 */
void findK(int B[][maxSize],int m,int n,int k){
int i=0,j=n-1;
while(B[i][j]!=k){
if(B[i][j]<k){
i++;
}else{
j--;
}
}
printf("%d,%d",i,j);
}
int main() {
int nums[][maxSize]= {{4,5,6},{7,10,11},{8,15,16},{9,17,20}};
int m=4,n=3,k=15;
findK(nums,m,n,k);
return 0;
}
运行结果: