题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
本题应考虑利用题目中给出的数组排列顺序,以减少时间复杂度(以O(n)为方向)
规律:从左下角开始,向上都是递减,向右都是递增(或从右上角开始,向下都是递增,向左都是递减),依次将不满足条件的行或列删去,缩小查找范围
(不可以从左上或右下开始哦,这样很容易忽略掉右上角方向的值)
#include<iostream>
using namespace std;
int main()
{
int array[4][4]={{1,3,8,9},{2,4,9,12},{4,7,11,13},{6,8,14,15}};
int target,row=3,col=0;
bool flag=false;
cout<<"请输入要查询的数字:";
cin>>target;
while(row>=0 && col<=3) //从左下角开始做判断,若target比左下角值大,则删掉最左一列;若比左下角值小,则删除最后一行
{
if(array[row][col]==target)
{
cout<<"该值所在行列:"<<row+1<<' '<<col+1<<endl;
flag=true;
break;
}
else if(array[row][col]>target)
{
row--;
}
else
{
col++;
}
}
if(!flag)
{
cout<<"该值在数组中不存在"<<endl;
}
}
但在一开始写这道题时,思路是偏的,用人脑的方式去想这个问题,计算机实现起来好像很复杂…还尝试过从右下角开始考虑,但是是会漏项的,所以还是要先好好思考!