原题网址:http://www.lintcode.com/zh-cn/problem/search-a-2d-matrix/#
写出一个高效的算法来搜索 m × n矩阵中的值。
这个矩阵具有以下特性:
- 每行中的整数从左到右是排序的。
- 每行的第一个数大于上一行的最后一个整数。
样例
考虑下列矩阵:
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
给出 target = 3
,返回 true
挑战
O(log(n) + log(m)) 时间复杂度
#include <iostream> #include <vector> #include <math.h> #include <string> #include <algorithm> using namespace std; //方法一:展开成一维数组,二分法查找; bool searchMatrix(vector<vector<int>> &matrix, int target) { if (matrix.empty()) { return false; } int row=matrix.size(); int col=matrix[0].size(); if (target<matrix[0][0]||target>matrix[row-1][col-1]) { return false; } vector<int> temp; for (int i=0;i<row;i++) { for (int j=0;j<col;j++) { temp.push_back(matrix[i][j]); } } //二分法查找; int size=temp.size(); int count=0; int max=size-1,mid=size/2,min=0; //mid=(max+min)/2; while(count!=size) { if (target==temp[mid]) { return true; } else if (target<temp[mid]) { max=mid-1; } else { min=mid+1; } mid=(max+min)/2; count ++; } return false; } //方法二:对行和列分别进行二分法查找; bool searchMatrix_w(vector<vector<int>> &matrix, int target) { if (matrix.empty()) { return false; } int row=matrix.size(); int col=matrix[0].size(); if (target<matrix[0][0]||target>matrix[row-1][col-1]) { return false; } //二分法查找行; int rowindex=0; int rowlow=0,rowhigh=row-1,rowmid=(rowhigh+rowlow)/2; while(rowlow<=rowhigh) { if (target==matrix[rowmid][0]||target==matrix[rowmid][col-1]) { return true; } else if (target>matrix[rowmid][0]&&target<matrix[rowmid][col-1]) { rowindex=rowmid; break; } else if (target<target>matrix[rowmid][0]) { rowhigh=rowmid-1; } else { rowlow=rowmid+1; } rowmid=(rowhigh+rowlow)/2; } //二分法查找列; int collow=0,colhigh=col-1,colmid=(colhigh+collow)/2; while(collow<=colhigh) { if (target==matrix[rowindex][colmid]) { return true; } else if (target<matrix[rowindex][colmid]) { colhigh=colmid-1; } else { collow=colmid+1; } colmid=(colhigh+collow)/2; } return false; }
参考: