【题目链接】
240. 搜索二维矩阵 II
【题目描述】
【题解】
方法1:二分
由于矩阵matrix
中每一行的元素都是升序排列的,因此我们可以对每一行 都使用一次二分查找 ,判断target
是否在该行中,从而判断target
是否出现。
【AC代码】
cpp
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
for(const auto& row : matrix) {
int l = 0, r = row.size() - 1;
while(l < r) {
int mid = (l + r) / 2;
if(row[mid] >= target)
r = mid;
else
l = mid + 1;
}
if(row[l] == target)
return true;
}
return false;
}
};
方法2:贪心
【思考&收获】
在第一次写的时候,外层循环写的是for(auto row : matrix)
,结果超出了内存限制。原因是for(auto row : matrix)
这种写法会将matrix
中的每一行复制到row
变量中。对于每一行,C++会执行一次拷贝操作,把该行的数据复制到row
变量。如果矩阵的每一行是一个大数组或较大的结构体,就会造成大量的内存开销,特别是在矩阵很大的情况下。如果矩阵中每一行非常大,或者矩阵本身非常大,那么这种拷贝操作可能导致内存不足,从而触发超出内存限制 的错误。
而for(const auto& row : matrix)
中,row
是对原行的常量引用。引用不会创建新的vector<int>
对象,也不会复制任何元素,它只是一个 "别名",指向matrix
中已存在的行。这种方式不会额外分配内存来存储行数据,仅使用原矩阵占用的内存,因此内存使用量不会激增,也就不会出现内存超限的问题。