文章图片
【算法|算法:二维数组中的查找】
在一个 n * m 的二维数组中 , 每一行都按照从左到右递增的顺序排序 , 每一列都按照从上到下递增的顺序排序 。 请完成一个高效的函数 , 输入这样的一个二维数组和一个整数 , 判断数组中是否含有该整数 。
示例现有矩阵 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 。
- 0 <= n <= 1000
- 0 <= m <= 1000
依次遍历二维数组的每一行和每一列 。 如果找到一个元素等于目标值 , 则返回 true 。 如果遍历完毕仍未找到等于目标值的元素 , 则返回 false 。
代码
复杂度分析
- 时间复杂度:O(nm) 。 二维数组中的每个元素都被遍历 , 因此时间复杂度为二维数组的大小 。
- 空间复杂度:O(1) 。
从二维数组的右上角开始查找 。 如果当前元素等于目标值 , 则返回 true 。 如果当前元素大于目标值 , 则移到左边一列 。 如果当前元素小于目标值 , 则移到下边一行 。
可以证明这种方法不会错过目标值 。 如果当前元素大于目标值 , 说明当前元素的下边的所有元素都一定大于目标值 , 因此往下查找不可能找到目标值 , 往左查找可能找到目标值 。 如果当前元素小于目标值 , 说明当前元素的左边的所有元素都一定小于目标值 , 因此往左查找不可能找到目标值 , 往下查找可能找到目标值 。
- 若数组为空 , 返回 false
- 初始化行下标为 0 , 列下标为二维数组的列数减 1
- 重复下列步骤 , 直到行下标或列下标超出边界
- 获得当前下标位置的元素 num
- 如果 num 和 target 相等 , 返回 true
- 如果 num 大于 target , 列下标减 1
- 如果 num 小于 target , 行下标加 1
- 循环体执行完毕仍未找到元素等于 target, 说明不存在这样的元素 , 返回 false
复杂度分析
- 时间复杂度:O(n+m) 。 访问到的下标的行最多增加 n 次 , 列最多减少 m 次 , 因此循环体最多执行 n + m 次 。
- 空间复杂度:O(1) 。
- 算法|难戒的个性化推荐:每一次“猜你喜欢”,都在“偷窥”你的生活
- 算法|中国年轻人为何愿意去老挝创业?那里的市场环境很熟悉,像在国内
- iQOO|光学防抖+旗舰影像算法普及者!iQOO Neo6 SE堪称同价位拍照王者
- instagram|Instagram的新算法,知道了让你抢先别人一步
- 算法|2020年,美国为阻中国芯片发展,全球通缉晋华陈正坤
- 算法|淘宝超级推荐推广在哪展现?有哪些投放模式?
- 算法|困于算法围城,年轻人躲不过的\算计\
- 算法|微博IP属地,库克在上海,比尔盖茨在河南,马斯克在北京,是为什么?
- 算法|来了!小米手环7、新一代小米手表正量产:屏幕更大、续航更强
- 算法|马斯克高价收购推特 外界人士对此反应不一