描述
在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
数据范围:矩阵的长宽满足 0 \le n,m \le 5000≤n,m≤500 , 矩阵中的值满足 0 \le val \le 10^90≤val≤109
进阶:空间复杂度 O(1)O(1) ,时间复杂度 O(n+m)O(n+m)
暴力解法
C
//c
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param target int整型
* @param array int整型二维数组
* @param arrayRowLen int array数组行数
* @param arrayColLen int* array数组列数
* @return bool布尔型
*/
bool Find(int target, int** array, int arrayRowLen, int* arrayColLen ) {
// write code here
if (NULL == array) { return false; }
for(int row = 0; row < arrayRowLen; row++) {
for(int col = 0; col < *arrayColLen; col++) {
if(target == array[row][col]) {
return true;
}
}
}
return false;
}
c++
//cpp
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
if(array.empty()) {return false;}
for(auto cIter = array.begin(); cIter != array.end(); cIter++) {
for(auto rIter = cIter->begin(); rIter != cIter->end(); rIter++) {
if(target == *rIter) {
return true;
}
}
}
return false;
}
};
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
for(auto i : array)//c++11语法
{
for(auto j : i)
{
if(j == target) return true;//找到目标值
}
}
return false;//未找到
}
};
二分查找
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
for(auto i : array) {
if (binary_search(target, i)) return true;
}
return false;
}
//下标
bool binary_search(int target, vector<int> array) {
vector<int>::size_type left = 0, right = array.size() - 1;
while(left <= right) {
vector<int>::size_type mid = left + (right - left)/2;
if(target == array[mid]) {
return true;
}
else if(target > array[mid]) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
return false;
}
//迭代器
bool binary_search2(int target, vector<int> v) {
auto left = v.begin(), right = v.end();
while(left != right) {
auto mid = left + (right - left)/2;
if (target == (*mid)) {
return true;
}
else if(target > (*mid)) {
left = mid + 1;
}
else right = mid;
}
return false;
}
};
注意:第33行,*mid需要加括号(*mid).
从右上像左下查找慢慢逼近
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
if(array.empty())
return false;
int row = 0, col = array[0].size() - 1;
while(row < array.size() && col >= 0) {
if(target == array[row][col])
return true;
else if(target < array[row][col])
col--;
else row++;
}
return false;
}
};