ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

元宝 LeetCode 74. 搜索二维矩阵 C++实现

元宝    LeetCode 74. 搜索二维矩阵 C++实现 LeetCode 74 “搜索二维矩阵”在 C 中的最优解同样是二分查找。由于矩阵每行递增且行与行之间也是整体递增的我们可以把它当作一个展开后的一维有序数组来处理时间复杂度为“O(log(m*n))”。方法一整体二分查找最推荐代码最简洁这是 LeetCode 上最主流的写法。将二维坐标“(i, j)” 映射为一维索引“mid / cols” 和“mid % cols”。class Solution {public:bool searchMatrix(vectorvector matrix, int target) {// 边界处理if (matrix.empty() || matrix[0].empty()) {return false;}int rows matrix.size(); int cols matrix[0].size(); int left 0; int right rows * cols; // 左闭右开区间 while (left right) { int mid left (right - left) / 2; int midValue matrix[mid / cols][mid % cols]; if (midValue target) { return true; } else if (midValue target) { left mid 1; } else { right mid; } } return false; }};方法二两次二分查找先定位行再定位列如果你希望更直观地利用矩阵的行列结构可以先二分查找目标值可能所在的行再在该行中二分查找。class Solution {public:bool searchMatrix(vectorvector matrix, int target) {if (matrix.empty() || matrix[0].empty()) return false;int m matrix.size(); int n matrix[0].size(); // 1. 二分查找确定目标所在的行 int top 0, bottom m - 1; while (top bottom) { int mid top (bottom - top) / 2; if (matrix[mid][0] target) return true; if (matrix[mid][0] target) { top mid 1; } else { bottom mid - 1; } } // top 指向第一个首元素大于 target 的行所以目标行是 top - 1 int row top - 1; if (row 0) return false; // target 比矩阵中所有元素都小 // 2. 在目标行中二分查找目标值 int left 0, right n - 1; while (left right) { int mid left (right - left) / 2; if (matrix[row][mid] target) return true; if (matrix[row][mid] target) { left mid 1; } else { right mid - 1; } } return false; }};方法三右上角/左下角指针法O(mn)如果你想要一个不需要复杂二分、逻辑非常直观的解法可以从矩阵的右上角开始当前值等于“target” → 找到当前值大于“target” → 剔除当前列向左移当前值小于“target” → 进入下一行向下移。class Solution {public:bool searchMatrix(vectorvector matrix, int target) {if (matrix.empty() || matrix[0].empty()) return false;int m matrix.size(); int n matrix[0].size(); int row 0, col n - 1; // 从右上角开始 while (row m col 0) { if (matrix[row][col] target) { return true; } else if (matrix[row][col] target) { col--; // 向左走 } else { row; // 向下走 } } return false; }};复杂度对比方法 时间复杂度 空间复杂度 特点整体二分“O(log(mn))”“O(1)” 效率最高代码最短面试首选两次二分“O(log m log n)”“O(1)” 逻辑清晰符合直觉右上角法“O(m n)”“O(1)” 不需要乘法/除法逻辑极简小贴士在 C 中“left (right - left) / 2” 可以有效防止“(left right)” 可能导致的整数溢出。如果面试中遇到这道题整体二分和右上角法都建议掌握后者在矩阵不具有“整体递增”特性例如每行列独立有序时也能通用。需要我帮你把这段代码改成递归版本或者结合单元测试GoogleTest来演示如何验证它的正确性吗
返回列表