《劍指offer》面試題4:二維數組中的查找

題目:在一個二維數組中,每一行都從左向右遞增,每一列都從上到下遞增。給定一個數target,判斷這個數是否出現在二維數組中。

解題思路

如果使用暴力搜索整個數組的話時間複雜度是O(n^2),比較不理想,那麼有沒有更快地方法呢?觀察如下數組

1   2    8    9
2   4    9   12
4   7   10   13
6   8   11   15

我們可以發現,在數組中有兩個特殊的點,就是矩陣的右上角和矩陣的左下角。這兩個點都有一個特性,如果目標值大於或小於點的值時,就可以排除一整列或者一整行,那麼最多只需要執行2n次排除操作,時間複雜度是O(n)。那麼我們以右上角爲例實現代碼:

    bool Find(int target, vector<vector<int> > array) {
        if (array.empty())  return false;

        int i = 0, j = array[0].size()-1;

        while(i<array.size() && j<array[0].size()){
            if (array[i][j]==target)
                return true;
            else if (array[i][j]<target)
                i++;
            else
                j--;
        }
        return false;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章