实现在一个二维数组中查找一个数字,常规的思想是查找的数字刚好是关键值;查找的数字比关键值小,说明当前值在关键值的左边或者是上面;查找的数字比关键值大摸索名当前值在关键值的右边或者是上边;能不能有一种高效的方法呢?
思路:
首先我们从右上角的数字开始,如果此时查找的数字刚好是我们要找的目标数字,表明查找结束,停止查找;如果此时查找的数字比目标数字大,表明目标数字不在本列,在其左边;继续查找,如果查找的数字比目标数字小,表情目标数字不在本行,在下一行查找;这样一步步缩小范围最后就会很快找到目标数字;
实现:
bool Find(int *arr, int rows, int cols, int key)
{
if (arr != NULL&&rows > 0 && cols > 0)
{
int row = 0;
int col = cols - 1;//行的下标
while (row < rows&&col >= 0)
{
if (arr[row*cols + col] == key)
{
return true;
break;
}
//查找范围的数大于关键值
else if (arr[row*cols+col]>key)
{
--col;//表明关键值在当前列的左边
}
//查找范围的数小于关键值
else
{
++row;//表明关键值在当前的行的上边
}
}
}
return false;
}
方法二:
动态数组vector这样下次查找会更加方便;
因此二维数组的查找我们可以抽象理解为其实就是在一维数组的查找不过,这个一维数组的元素仍然是一个数组;
我们知道二维数组从上到下是递增的从左到右是递增的,
所以当targer小于array[row][col]时,表明target在array[row][col]的左边;此时–col当targer大于array[row][col]时,表明target在array[row][col]的下边++row;
使用动态数组vector;
bool Find(int target, vector<vector<int> > array) {
int row =0;
int col =array[0].size()-1;
while((row<=array.size()-1)&&(col>= 0))
{
if(array[row][col] ==target)
{
return true;
break;
}
else if(array[row][col] >target)
{
--col;
}
else{
++row;
}
}
return false;
}