剑指offer1_二维数组中的查找_题解

二维数组中的查找

题目描述

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

示例1

输入

7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]

返回值

true

分析

方案一:二分

数组每一行均为有序数组,满足使用二分查找的前提条件

依次对数组每一行进行二分查找,若找到则返回true,遍历完所有行均未找到则返回false

代码

/**
复杂度分析
1.时间复杂度:O(nlogn)
2.空间复杂度:O(1)
**/
bool Find(int target, vector<vector<int>> array)
{
    int rows = array.size();//rows:数组行数
    // 依次对数组每一行进行二分查找
    for(int i = 0; i < rows; i++){
        // 若待查找元素在第i行找到,则提前终止查找,返回true; 否则继续查找下一行
        if(binary_search(array[i].begin(), array[i].end(), target)){
            return true;
        }
    }
    // 若待查找元素在所有行中都未找到,则返回false
    return false;
}

方案二:利用数组性质

每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序

从矩阵的左下角看,上方的数字都比其小,右方的数字都比其大

设当前数字为 cur,目标数字为 target

  • 当 target < cur 时,行数减1,cur 更新为其上面一行的数字

  • 当 target > cur 时,列数加1,cur 更新为其右侧一列的数字

  • 当 cur == target 时则返回 true

  • 否则当行数或列数超过矩阵边界时返回 false

代码

/**
复杂度分析
1.时间复杂度:O(m+n)
2.空间复杂度:O(1)
**/
bool Find(int target, vector<vector<int>> array)
{
    int rows = array.size();//rows:数组行数
    int cols = array[0].size();//cols:数组列数
    int i = rows - 1, j = 0;//i:行坐标,j:列坐标,初始位置为左下角元素
    while (i >= 0 && j < cols)
    {
        int cur = array[i][j];
        // 当 target < cur 时,行数减1,cur 更新为其上面一行的数字
        if (target < cur)
        {
            i--;
        }
        // 当 target > cur 时,列数加1,cur 更新为其右侧一列的数字
        else if (target > cur)
        {
            j++;
        }
        // 当 cur == target 时返回 true
        else
        {
            return true;
        }
    }
    // 当行数或列数超过矩阵边界时返回 false
    return false;
}
posted @ 2020-11-30 16:03  RiverCold  阅读(34)  评论(0编辑  收藏  举报