马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
标题链接:搜索二维矩阵
固然本题利用二分法,但二分的写法有很多种,以是在判定 target 巨细与有序部门的关系的时间大概会出现细节上的差异。
1、 本题则是与常用代码差别的是:
else if(target<matrix[midRow][columnR])
{
rowH=midRow+1; //本题要改为rowH=midRow,
}
else{
rowL=midRow+1;
}
由于当target<matrix[midRow][columnR]时,target是小于midRow这一行的最右侧的最大元素,而这一行的其他比最右侧元素小的元素与target的关系未知。以是,应该rowH=midRow,而不是rowH=midRow+1。这是为了防止target在矩阵中存在,但是没有搜索到。
2、另一个差别的地方就是二分法的停止条件要从while(l<=r)改为while(l<r)。这是为了防止l大概r越上界大概下界。
c++代码实现
- class Solution {
- public:
- bool searchMatrix(vector<vector<int>>& matrix, int target) {
- int columnL=0,columnR=matrix[0].size()-1;
- int rowL=0, rowH=matrix.size()-1;
- if(columnR==0 && rowH==0)
- {
- if(matrix[0][0]==target)
- {
- return true;
- }
- else{
- return false;
- }
- }
- while (rowL<rowH)
- {
- int midRow = (rowL+rowH)/2;
- if(target == matrix[midRow][columnR])
- {
- return true;
- }
- else if(target<matrix[midRow][columnR])
- {
- rowH=midRow;
- }
- else{
- rowL=midRow+1;
- }
- }
- if(matrix[rowL][columnL]==target)
- {
- return true;
- }
-
- //处理行:rowL行
- while(columnL<columnR)
- {
- int midColumn=(columnL+columnR)/2;
- if(target==matrix[rowL][midColumn])
- {
- return true;
- }
- else if(target<=matrix[rowL][midColumn]){
- columnR=midColumn;
- }
- else{
- columnL=midColumn+1;
- }
- }
- if(matrix[rowL][columnL]==target)
- {
- return true;
- }
- return false;
- }
- };
复制代码 |