題目描述
在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
算法實現
從矩陣左下角元素開始,比它小的在它上面,比它大的數在它右邊。矩陣中所有元素都滿足這個性質,利用這個特性進行查找。算法複雜度O()。
bool Find(int target, vector<vector<int> > array) {
int h = array.size(), w = array[0].size();
int y = h - 1, x = 0;
int val;
while (y >= 0 && x <= w - 1) {
val = array[y][x];
if (target == val) {
return true;
} else if (target < val) {
y -= 1;
} else {
x += 1;
}
}
return false;
}
另外的思路
簡單查找,複雜度O()
bool Find(int target, vector<vector<int> > array) {
int h = array.size(), w = array[0].size();
for (int y = 0; y < h; ++y) {
for (int x = 0; x < w; ++x) {
if (array[y][x] == target) {
return true;
}
}
}
return false;
}
對每一行使用二分查找,算法複雜度O()
bool Find(int target, vector<vector<int> > array) {
int h = array.size(), w = array[0].size();
int low, high, mid, val;
for (int y = 0; y < h; ++y) {
low = 0;
high = w - 1;
while(low <= high) {
mid = (low + high) / 2;
val = array[y][mid];
if (target == val) {
return true;
} else if (target < val) {
high = mid - 1;
} else {
low = mid + 1;
}
}
}
return false;
}