题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
算法实现
从矩阵左下角元素开始,比它小的在它上面,比它大的数在它右边。矩阵中所有元素都满足这个性质,利用这个特性进行查找。算法复杂度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;
}