题解 | 二维数组中的查找

二维数组中的查找

https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=295&tqId=1499549&sourceUrl=%2Fexam%2Foj

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param target int整型
     * @param array int整型vector<vector<>>
     * @return bool布尔型
     */
    bool Find(int target, vector<vector<int> >& array) {
        // write code here
        // 处理空数组的情况
        if (array.empty() || array[0].empty()) {
            return false;
        }

        int rows = array.size();
        int cols = array[0].size();

        // 从右上角开始搜索
        int row = 0;
        int col = cols - 1;

        while (row < rows && col >= 0) {
            if (array[row][col] == target) {
                return true;  // 找到目标值
            } else if (array[row][col] > target) {
                col--;  // 当前值太大,向左移动(排除整列)
            } else {
                row++;  // 当前值太小,向下移动(排除整行)
            }
        }

        return false;  // 未找到目标值
    }
};

方法思路
这个问题是在一个特殊的二维数组(矩阵)中查找目标值。该矩阵的每一行从左到右递增,每一列从上到下递增。我们可以利用这种特殊的排序特性来高效地查找目标值。

问题分析:矩阵具有行列递增的特性,这意味着我们可以从矩阵的右上角或左下角开始查找,利用这种特性快速缩小搜索范围。

算法选择:从矩阵的右上角开始查找:
如果当前元素等于目标值,返回true。
果当前元素大于目标值,由于当前列是递增的,目标值不可能在当前列中,因此向左移动一列。
如果当前元素小于目标值,由于当前行是递增的,目标值不可能在当前行中,因此向下移动一行。

复杂度分析:该算法的时间复杂度为O(n + m),其中n是矩阵的行数,m是矩阵的列数。空间复杂度为O(1),因为只使用了常数级别的额外空间。

选择右上角或左下角的关键优势:
1.控制变量:每次比较都能确定性地排除一整行或一整列
2.搜索路径唯一:不会出现多方向选择的困境
3.时间复杂度最优:O(n+m),最多遍历n行+m列
这种选择利用了矩阵的特殊排序性质,将二维搜索问题转化为一维的线性遍历,是典型的"以空间换时间"的优化策略。

二分查找/排序 文章被收录于专栏

特性 二分查找 二分插入排序 目的 在有序集合中快速查找元素 对一个无序集合进行排序 核心 分治,每次将搜索范围减半 在插入排序中,用二分法找插入点 前提 数据必须有序 无特殊前提 时间复杂度 O(log n) O(n&sup2;)(但比较次数为 O(n log n)) 空间复杂度 O(1)(迭代) O(1)

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务