python多维数组例题_二维数组的查找—分治算法经典例题

问题是这样的:给定一个 min 的二维数组,其中每行的元素从左到右升序排序,每列的元素从上到下升序排序,又给定一个目标值,请返回目标值是否存在于二维数组里。这个问题与二分查找有相似之处,不同的是搜索范围从一维数据结构变成了二维数据结构。

问题示例:

[

[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]

]

输入目标值=12

输出:True

输入目标值= 45

输出:False

我们可以怎样利用矩阵的特殊条件呢?如图 1 所示,通过观察发现,每一个元素都是以它为左上角的矩阵中的最小值。

图 1:思路一

因此,如果目标值小于左上角的值,那目标值肯定不在矩阵里面,我们可以直接返回 False。问题是如果目标值大于左上角的值怎么办,我们应该如何确定目标值位于矩阵中?

一个办法是一排一排地检查,另一个办法是把矩阵划分成两个或四个子矩阵再递归检查。但是有一个更好的办法,它需要我们换一个思路,从观察矩阵的左下角的值开始。

如图 2 所示,暂时用 x 代称左下角的值。通过观察得出,同行的值都大于 x,同列的值都小于 x。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值