关于二维数组,在我的概念里只有 a[i][j] 类似的样子,今天刷了一次剑指offer,使用C++编程,里面要求使用vector容器,虽然听说过,但没有使用过,查阅了一些资料,有了基础,就可以开始尝试。
C++ vector的用法(整理)
C++ vector 实现二维数组,赋值
题目描述:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
模板为:
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
}
};
暴力求解:
我的第一个思路就是直接搜索二维数组,暴力求解,最坏的情况时间复杂度为O(n^2)。
(虽说简单,需要注意的是在读取数组时,应先判断数组是否为空,我觉得这样可以节省一定时间)
bool Find(int target, vector<vector<int> > array) {
//判断数组是否为空
if(array.size() == 0 || array[0].size() == 0)
return false;
for(int i = 0; i < array.size(); i++)
{
for(int j = 0; j < array[i].size(); j++)
if(target == array[i][j])
return true;
}
return false;
}
二分法求解:
我们还有已知条件还没有用——数组从左到右递增,从上到下递增,怎样可以更快呢,那就可以使用二分法将需要查找的范围逐步减半,这样更可以节省时间,提高效率。(先把判断数组是否为空养成习惯)
bool Find(int target, vector<vector<int> > array) {
if (array.size() == 0 || array[0].size() == 0)
return false;
for (int i = 0; i < array.size(); i++)
{
//从每行最大值与target判断,有可能直接跳过某行
int high = array[i].size() - 1;
if (array[i][high] < target)
continue;
else if (array[i][high] == target)
return true;
else if (array[i][high] > target)
{
int low = 0;
int mid = 0;
while (low <= high)
{
mid = (low + high) / 2;
if (array[i][mid] == target)
return true;
else if (array[i][mid] > target)
{
high = mid - 1;
}
else if (array[i][mid] < target)
{
low = mid + 1;
}
}
}
}
return false;
}
在编写二分法的过程中需要注意low和high变量的赋值,可能稍有不慎就会陷入死循环。
而且千万不要把这个二维数组当作一维来处理,因为可能后行前面的数字比前行后面几个数字还大,这样就不是一维排序的数组了。