题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路分析
我的思路比较简单粗暴,既然是有规律数组,那就按照它的规律来。大概核心思路如下图:
细节注意
- 本题的二维数组传参是以vector里套vector的形式给出来的,所以一定要熟悉关于vector的一些操作。
- 由于这个题目是在牛客网上的,一开始我写的时候并没有给传进来的数组判空,所以提交代码一直报错说
程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)”错误的可能原因
后面我想了想,如果不给二维数组和二维数组里的每一行的一维数组判空,而同时使用vector里的size()函数,就会引发错误。所以,一定要判空!
源代码:
class Solution
{
public:
bool Find(int target, vector<vector<int>> array)
{
//注意一定要先判空,再求array的size
if (array.empty())
{
return false;
}
int len = array.size();
//int lensize = array[0].size();
for (size_t i = 0; i < len; i++)
{
if (array[i].empty())
{
continue;
}
if (target == array[i][0])
{
return true;
}
if (target > array[i][0])
{
if (target <= array[i][array[i].size() - 1])
{
for (size_t j = 0; j < array[i].size(); j++)
{
if (target == array[i][j])
{
return true;
}
}
}
}
}
return false;
}
};
int main()
{
vector<vector<int>> v{ {10,20,30},{11,22,33},{100},{200},{300},{120,220,330} };
Solution s;
if (s.Find(100, v))
{
cout << "find it" << endl;
}
else
{
cout << "can't find" << endl;
}
system("pause");
return 0;
}