题目:在一个二维数组中 每一行都按从左到右递增的顺序排序 每一列都按照从上到下递增的顺序排序 请完成一个函数 输入这样一个二维数组和一个整数 判断数组中是否含有该整数
1 | 2 | 8 | 9 |
2 | 4 | 9 | 12 |
4 | 7 | 10 | 13 |
6 | 8 | 11 | 15 |
假设要查找的是7
如上图的一个二维数组 每一行从左到右递增 可以从最后一列遍历数组 如果最后一列的值 9 ,9>7 说明 7肯定在9所在列的左侧 因为9所在列的右边列都大于9 因此比较9左边的一列 缩小了搜索的范围~
8>7 同理 7所在的列应当在8的左边 2<7 , 因为数组从上到下也是递增的
7只有可能在2的下面行 因此剔除2所在的行 比较 4<7 说明 7只有可能在4所在行的下面 剔除4所在的行 则7==7 找到要查询的数
int A[4][4]={1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15};
int k=7;
int i=3;//行
int j=0;//列
bool flag=false;
while(i>=0 && j<=3)
{
if(A[j][i]==k)
{
flag=true;
break;
}
else
if(A[j][i]>k)
i--;
else
j++;
}
cout<<flag<<endl;
算法时间复杂度O(m+n)
也可以从数组的左下角比较 但是从左上角和右下角无法比较 因为左上角 如果1<7则7在1的右侧或下侧 无法排除1所在的行 即 无法缩小搜索范围 ~同理右下角也是