題目描述
在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
解法1
最簡單的思路,就是暴力遍歷,for循環遍歷數組所有元素,判斷該整數是否存在。再利用題目給出的每一行遞增,每一列遞增的兩個特點進行優化。當查找到某行的第一列的元素就已經比目標整數大了,就不用再繼續進行遍歷了,因爲後面行的所有元素都會比目標整數大。同理,當查找到某行某列的元素已經比目標整數大了,也可以不用再遍歷該列後面的所有列了,因爲後面的所有列都會比目標整數大。
實現代碼
public bool Find(int target, int[][] array)
{
if (array.Length > 0 && array[0].Length > 0)
{
int col = array[0].Length;
for (int i = 0; i < array.Length; i++)
{
if (array[i][0] > target)
{
// 該行後面的所有行將不再遍歷
break;
}
for (int j = 0; j < col; j++)
{
if (array[i][j] == target)
{
return true;
}
else if (array[i][j] > target)
{
// 該列後面的所有列將不再遍歷
col = j;
break;
}
}
}
}
return false;
}
需注意的問題
這道題我在第一次提交的時候未通過,原因是忘記判斷二維數組中元素爲0的情況。以後需要格外留心類似這種爲空或爲0的特殊情況
解法2
我們可以通過本題二維數組每行遞增,每列遞增的特點,總結出相關規律,如下所示。可以發現,如果從數組的左下角或右上角觀察,數組是有序的。這裏以左下角爲例,向右的話元素遞增,向上的話元素遞減。即從左下角開始查找,當目標整數比左下角數字大時右移(比目標整數大的一定在其右邊),比左下角數字小時上移(比目標整數小的一定在其上面)。
實現代碼
public bool FindOptimize(int target, int[][] array)
{
int row = array.Length - 1;
int col = 0;
while(row >=0 && col < array[0].Length){
if(array[row][col] == target)
{
return true;
}else if(array[row][col] > target)
{
row--;
}
else
{
col++;
}
}
return false;
}