劍指Offer 二維數組中的查找

題目描述

在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

解法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

我們可以通過本題二維數組每行遞增,每列遞增的特點,總結出相關規律,如下所示。可以發現,如果從數組的左下角或右上角觀察,數組是有序的。這裏以左下角爲例,向右的話元素遞增,向上的話元素遞減。即從左下角開始查找,當目標整數比左下角數字大時右移(比目標整數大的一定在其右邊),比左下角數字小時上移(比目標整數小的一定在其上面)。
[12345246810459121389101112] \left[ \begin{matrix} 1 &amp; 2 &amp; 3 &amp; 4 &amp; 5\\ 2 &amp; 4 &amp; 6 &amp; 8 &amp; 10 \\ 4 &amp; 5 &amp; 9 &amp; 12 &amp; 13 \\ 8 &amp; 9 &amp; 10 &amp; 11 &amp; 12 \end{matrix} \right]

實現代碼

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章