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