【LeetCode题解】LeetCode 240. 搜索二维矩阵 II

【题目链接】
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:贪心

240. 搜索二维矩阵 II(贪心,清晰图解)

【思考&收获】

在第一次写的时候,外层循环写的是for(auto row : matrix),结果超出了内存限制。原因是for(auto row : matrix)这种写法会将matrix中的每一行复制到row变量中。对于每一行,C++会执行一次拷贝操作,把该行的数据复制到row变量。如果矩阵的每一行是一个大数组或较大的结构体,就会造成大量的内存开销,特别是在矩阵很大的情况下。如果矩阵中每一行非常大,或者矩阵本身非常大,那么这种拷贝操作可能导致内存不足,从而触发超出内存限制 的错误。

for(const auto& row : matrix)中,row是对原行的常量引用。引用不会创建新的vector<int>对象,也不会复制任何元素,它只是一个 "别名",指向matrix中已存在的行。这种方式不会额外分配内存来存储行数据,仅使用原矩阵占用的内存,因此内存使用量不会激增,也就不会出现内存超限的问题。