作者:Gefose-洋娃娃_357 | 来源:互联网 | 2024-11-18 17:06
题目描述:
编写一个高效的算法,用于在 m x n 矩阵中搜索目标值 target。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
示例:
给定矩阵 matrix 如下:
[[1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]
给定 target = 5,返回 true。
给定 target = 20,返回 false。
分析:根据矩阵的存储规律,我们需要查找矩阵中是否存在目标值 target。如果存在,则返回 true;否则返回 false。需要注意的是,matrix[j][i] 与 target 值的比较,以及 i 和 j 的边界值判断。
获取矩阵的行数和列数:
row = matrix.size(); // 行数
col = matrix[0].size(); // 列数
解决方案:
方法一:双层 for 循环,时间复杂度 O(m * n)
class Solution { public: bool searchMatrix(vector>& matrix, int target) { if (matrix.empty() || matrix[0].empty()) return false; for (int i = 0; i
方法二:单层循环,时间复杂度 O(m + n)
思路:从矩阵的右上角开始搜索,如果当前元素等于目标值,则返回 true;如果当前元素小于目标值,则向下移动一行;如果当前元素大于目标值,则向左移动一列。
示例矩阵:
例如,寻找 11 时的过程:从右上角 (1, 4) 开始,与 4 比较,11 大于 4,向下移动到 (2, 4),与 8 比较,11 大于 8,继续向下移动到 (3, 4),与 12 比较,11 小于 12,向左移动到 (3, 3),找到 11。
class Solution { public: bool searchMatrix(vector>& matrix, int target) { if (matrix.empty() || matrix[0].empty()) return false; int row = 0, col = matrix[0].size() - 1; while (row = 0) { if (matrix[row][col] == target) return true; else if (matrix[row][col]