[剑指Offer]二维数组中的查找
2013-06-24 17:10
197 查看
思路:这题二维矩阵少了Leetcode中的一个限制,就是这一行的最左边的值并一定比前一行的最右边的值大。我们同样也是先找到所在行,然后在该行二分查找,但是定位所在行的方式需要改变。
有种思路比较简单的方法,从矩阵的右上角开始,根据比较结果,要么往下一行,要么往左一列。
#include <iostream> #include <cstdio> #include <vector> using namespace std; bool SearchMatrix(vector<vector<int> > &matrix, int target) { if(matrix.empty() || matrix[0].empty()) return false; int row = -1; { int l = 0, r = matrix.size() - 1; while(l <= r) { int mid = l + (r - l) / 2; if(target < matrix[mid].back()) r = mid - 1; else if(target > matrix[mid].back()) l = mid + 1; else return true; } row = l; } if(row == matrix.size()) return false; int l = 0, r = matrix[0].size() - 1; while(l <= r) { int mid = l + (r - l) / 2; if(target < matrix[row][mid]) r = mid - 1; else if(target > matrix[row][mid]) l = mid + 1; else return true; } return false; } int main() { int m, n, target; while(cin>>m>>n>>target) { vector<vector<int> > matrix(m, vector<int>(n)); for(int i = 0; i < m; ++i) for(int j = 0; j < n; ++j) scanf("%d", &matrix[i][j]); if(SearchMatrix(matrix, target)) printf("Yes\n"); else printf("No\n"); } return 0; }
有种思路比较简单的方法,从矩阵的右上角开始,根据比较结果,要么往下一行,要么往左一列。
#include <iostream> #include <cstdio> #include <vector> using namespace std; bool SearchMatrix(vector<vector<int> > &matrix, int target) { // Start typing your C/C++ solution below // DO NOT write int main() function if(matrix.empty() || matrix[0].empty()) return false; int row = -1; { int l = 0, r = matrix.size() - 1; while(l <= r) { int mid = l + (r - l) / 2; if(target < matrix[mid].front()) r = mid - 1; else if(target > matrix[mid].back()) l = mid + 1; else { row = mid; break; } } } if(row == -1) return false; bool ans = BinarySearch(matrix[row], target); if(row > 0) ans = ans | BinarySearch(matrix[row-1], target); if(row < matrix.size()-1) ans = ans | BinarySearch(matrix[row+1], target); return ans; } bool BinarySearch(vector<int> &arr, int target) { int l = 0, r = arr.size() - 1; while(l <= r) { int mid = l + (r - l) / 2; if(target > arr[mid]) l = mid + 1; else if(target < arr[mid]) r = mid - 1; else return true; } return false; } int main() { int m, n, target; while(cin>>m>>n>>target) { vector<vector<int> > matrix(m, vector<int>(n)); for(int i = 0; i < m; ++i) for(int j = 0; j < n; ++j) scanf("%d", &matrix[i][j]); if(SearchMatrix(matrix, target)) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- 【剑指Offer学习】【面试题3 :二维数组中的查找】
- 剑指Offer之二维数组中的查找
- [剑指offer]二维数组中的查找
- 剑指Offer-1.二维数组中的查找
- 剑指offer:二维数组的查找
- 剑指offer:二维数组中的查找
- 10分钟一题剑指OFFER-二维数组中的查找
- 剑指offer|面试题3:二维数组中的查找(Java实现)
- 【剑指Offer面试题】九度OJ1384:二维数组中的查找
- 牛客网-剑指Offer-二维数组的查找
- 剑指offer——面试题3:二维数组中的查找
- 剑指offer_二维数组中的查找
- 剑指Offer_4_二维数组中的查找
- 剑指Offer之1384:二维数组中的查找
- 剑指offer面试题3之二维数组中的查找
- 剑指offer 1 二维数组中的查找
- 剑指offer之二维数组的查找
- 剑指offer——二维数组中的查找
- 剑指Offer面试题4:二维数组中的查找
- 剑指offer 二维数组查找