题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
样例
Input: nums[][] =
[
[1,2,8,9]
[2,4,9,12]
[4,7,10,13]
[6,8,11,15]
]
如果输入查找值为7,则返回true
如果输入查找值为5,则返回false
解题思路
-
普通思路
-
描述
遍历整数数组,一一对比,相等则返回。 -
实现代码:
/* 使用到的头文件 #include <vector> */ bool binarySearch(vector<vector<int> > vec,int search) { if (vec.empty()) { return false; } for (int i = 0; i < vec.size(); i++) { for (int j = 0; j < vec[i].size(); j++) { if (vec[i][j] == search) //找到返回true { return true; } } } return false; //找不到返回false }
-
复杂度分析
时间复杂度: O ( n 2 ) O(n^2) O(n2)
二重循环需要 n 2 n^2 n2
空间复杂度: O ( 2 ) ≈ O ( 1 ) O(2) \approx O(1) O(2)≈O(1)
使用两个临时变量i,j
-
-
高级思路
-
描述
本题目存在一个特性:对任意一个元素,从行上讲,它大于前面的元素,从列上讲,它小于下面的元素。
我们可以通过这样一个特性,每次减少一行或
-
实现代码
/* 使用到的头文件 #include <vector> */ bool binarySearch(vector<vector<int> > vec,int search) { if (vec.empty() || vec[0].empty()) { return false; } int i = 0, j = vec[0].size() - 1; while ((i<vec.size()) && (j >= 0)) { if (vec[i][j] == search) //相等返回true { return true; } else if (vec[i][j] > search) //该值大于寻找值,j-- { j--; } else //该值小于寻找值,i++ { i++; } } return false; }
-
复杂度分析
时间复杂度: O ( 2 n ) O(2n) O(2n)
最多循环(行数 + 列数)次
空间复杂度:$O(2) \approx O(1) $
使用四个临时变量i,j
-