題目:在一個二維數組中,每一行都從左向右遞增,每一列都從上到下遞增。給定一個數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;
}