编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
示例 2:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:9.2 MB, 在所有 C++ 提交中击败了80.04%的用户
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
// 那么简化先判断在哪一行
int line = judgeline(matrix,target);
cout<<line;
if(line<0|| line>= matrix.size()) {
return false;
}
return bfind(matrix[line],target);
}
int judgeline(vector<vector<int>>& matrix,int target) {
int begin = 0;
int end = matrix.size();
int res;
int mid;
while(begin<end) {
mid = begin+(end-begin)/2;
if(target==matrix[mid][0]) {
return mid;
} else if(target<matrix[mid][0]) {
end=mid;
} else {
begin = mid+1;
res=mid;
}
}
return res;
}
bool bfind(vector<int> matrix,int target) {
int left = 0;
int right = matrix.size();
while(left<right) {
int mid = left+(right-left)/2;
if(matrix[mid]==target) {
return true;
} else if(matrix[mid]<target) {
left=mid+1;
} else {
right=mid;
}
}
return false;
}
};
思路
进行两次二分查找,先判断数字再哪一行再判断数字在哪一列
原来二分查找可以用来找到距离target最近的小于target的最大的数,与单调栈不同的是,单调栈原本的序列是无序的,单调栈也可以找到离target最近的最大或最小的数
关键在于记住每一个条件下的mid,这个条件根据需求可能是value<target或者value>target
这篇博客介绍了一个高效的C++算法,用于在特定矩阵中判断是否存在目标值。矩阵特点是每行整数升序排列且每行首元素大于前一行末元素。算法通过两次二分查找,首先确定目标值可能所在的行,然后在该行内查找目标值。这种方法在时间和内存效率上表现出色,达到了0ms的执行时间和9.2MB的内存消耗。
163

被折叠的 条评论
为什么被折叠?



