欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > 【力扣hot100题】(020)搜索二维矩阵Ⅱ

【力扣hot100题】(020)搜索二维矩阵Ⅱ

2025/4/19 10:02:22 来源:https://blog.csdn.net/s478527548/article/details/146802394  浏览:    关键词:【力扣hot100题】(020)搜索二维矩阵Ⅱ

一开始以为一行的末尾小于下一行的开头,于是傻傻的写了两二分查找,所幸的是发现了自己在二分查找上确实不怎么熟练,巩固了一下知识。

这是一开始写的错误答案:

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int left=0;int right=matrix[0].size()-1;int record=0;while(left<=right){int middle=left+(right-left)/2;if(matrix[0][middle]>target) right=middle-1;else if(matrix[0][middle]<target) {record=left;left=middle+1;}else return 1;}left=0;right=matrix.size()-1;while(left+1<right){int middle=(left+right+1)/2;if(matrix[middle][record]>target) right=middle;else if(matrix[middle][record]<target) left=middle;else return 1;}if(matrix[left][record]==target||matrix[right][record]==target) return 1;return 0;}
};

记起来了二分查找中left和right不能只是等于mid,而是要在mid的基础上加或减,不然会死循环,并且跳出while的条件不能包含left==right,两者相等的情况下还要继续二分。

看答案学到了二分查找的逃课快速实现法:

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {for(auto& row:matrix){auto it=lower_bound(row.begin(),row.end(),target);if(it!=row.end()&&*it==target) return 1;}return 0;}
};

lower_bound是一个二分查找的逃课函数,传入始末向量和target,就可以二分搜寻出最接近target的不小于target的元素,如果没有将返回end()。

答案还有一种很天才的思路:z字型查找,从右上开始搜索,如果比target小就删除最上行,比target大就删除最右行,非常高效。

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int n=matrix.size();int m=matrix[0].size();int x=0;int y=m-1;while(x<n&&y>=0){if(matrix[x][y]>target) y--;else if(matrix[x][y]<target) x++;else return 1;}return 0;}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词