之前写过一些剑指offer的题目,但是遇到vector的时候都会跳过因为并不清楚vector容器到底是个什么,前几天在对vector进行简单的了解之后,理解不是很深刻,但是可以使用vector来做题了。
题目: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
之前我们在正常的数组中写过一次这种题,
简单来说将二维数组假设成一个正方形,那么最小的数据在二维数组的左上角,最大的数据在二维数组的右下角,并且箭头指向的方向数据都是递增的,但是如果你说我要比右上角和左下角谁大,这个是不确定的。
Vector中给我们封装了很多的函数,我们直接拿过来使用就可以了。
https://blog.csdn.net/Hanani_Jia/article/details/81515508 之前我的博客中对一些常用的函数进行了简单的介绍,在做这些题的时候基本足够使用了。
我们现在用的思路是,我们让我们传入的元素和我们二维数组中的右上角和左下角两个元素中的一个来比较
也就是让我们传入的元素首先和1位置或者2位置其中一个比较,两个随便选一个就可以。
假如我们这里让传入的元素和右上角的元素进行比较也就是1位置。
假如我们这个传入的元素比我们1位置的数据小,那他一定不在1位置这一列一定在他左边的列里边,这次位置就缩小了,
这时候我们寻找的范围就是红色区域了,这时候我们继续让红色框中右上角和传入的元素比较,如果还是小那就像刚刚一样继续缩小列,如果说我现在传入的元素比右上角的数据大了,那就说明,想要寻找的数据一定不在当前1位置所在的这一行,因为当前1位置是这一行中最大的数据,那这时候范围就要让行向下缩小。
如果元素比1位置要大的话寻找数据的区域就变成了蓝色框中的位置。
也就是说如果当前数据比1位置大那就让行++,如果说比1位置小那就让列——,否则那就是找到了,如果到了行或者列其中一个超过边界了,那就说明我们的数据不在当前区域中。
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
if (array.empty())//如果是空的那么返回真值就进入if条件语句
return false;//如果进来说明容器中是空的直接返回错误就可以
int row = 0;//最上边一行
int col = array[0].size() - 1;//最右边一列
while (col >= 0 && row < array.size())//如果还在范围内那就继续比较如果不在了那就不进入循环了说明不存在这个数据
{
if (target < array[row][col])
col--;//小说明不可能在当前这一列
else
{
if (target>array[row][col])
{
row++;//大说明不可能在当前这一行
}
else
{
return true;//不大不小说明就是这个数据说明存在
}
}
}
return false;//退出循环之后说明范围内没有这个数据那就返回错误的值。
}
};