題目描述
在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
思路分析
我的思路比較簡單粗暴,既然是有規律數組,那就按照它的規律來。大概核心思路如下圖:
細節注意
- 本題的二維數組傳參是以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;
}