題目
在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
分析
如果選擇在中間選擇一個數與target進行比較並以矩形的方式拓展搜索範圍,如果不相等,那麼剩下的搜索範圍就會有重疊,所以這種方案比較難以繼續往下分析。
於是,根據數組的排列特點,選擇右上角或左下角的數與target進行比較。
假設選擇右上角的數,如果相等,那麼就搜索到了;如果比target大,那麼就捨棄當前這個數所在的列;如果比target小,那麼就捨棄當前這個數所在的行。 以此來減小搜索範圍。
【補充】
vector表示的二維數組,例如:vector<vector<int> > vec,
- 判斷vec對象是否爲空的方法:vec.empty();
- 獲取行的方式:vec.size();
- 獲取列的方式:vec[0].size()。
代碼
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
bool found = false;
if(array.empty() || array.size() == 0) return found;
int rows = array.size();//獲取二維數組的行數
int columns = array[0].size(); //獲取二維數組的列數
int row = 0;
int column = columns - 1;
while(row < rows && column >= 0) {
if(array[row][column] == target) {
found = true;
break;
} else if(array[row][column] > target) {
--column;
} else {
++row;
}
}
return found;
}
};