算法1:从一个有序二维数组中查找目标值

import numpy as np


#这里是从一个有序二维数组中(从左到右递增,从上到下递增)查找一个数字
#要求的时间复杂度是O(m+n)
#这就要求不能用循环了
#非常机敏的方法是数组从右上角查找,若其大于目标数值,则向左走
#表现为索引值列数减1
#若其小于目标值,则其行数加1
#表现为索引值行号加1
#这算法写得真牛,不知道谁写出来的,厉害,在此实现,向前辈致敬
#总结:算法的问题就是确定的问题,规律的问题。在这里,我们知道了递增方向
#按照常有思维是从小到大找,从左到右找。这在没有时间复杂度的要求的情况下是
#完全合格的。但是在有O(m+n)的前提下,我们需要找到一个类似"二分法"的路径。
#从右上角寻找就完全满足了“二分法”这一点要求。从右上角开始搜索的时候,
#我们知道,向左走,数值减小;向右走,数值增大。这就是“二分法”的一个完美场景。
#牛逼了,前辈!

#定义一个二维数组
a = [[1,4,7,11],
     [2,5,8,12],
     [3,6,9,16],
     [10,13,14,17],
     [18,21,23,26]
     ]
#将数组转换为二维矩阵的形式,方便后续查找(要使用到二维数组的维度信息)
a = np.array(a)

#定义右上角索引值,即开始查找的位置
i = 0#row
j = a.shape[1] - 1#col

#定义要查找的目标值
target = 8

#定义一个查询标记:如果经过后续查找,我们发现其有相应值,标记其为真;
#否则,不作响应,保持其为假的状态
b = False

#查找
while (i>=0)&(j>=0):
    if a[i][j] == target:
        b = True
        break
    if a[i][j]<target:
        i = i + 1
    if a[i][j]>target:
        j = j - 1

#输出跳出喜欢时候,查找结束的索引值
print("Index:("+str(i)+","+str(j)+")")
#输出查找结果
if b:
    print("Exist the target num:",target)
else:
    print("Don't exists the target num:",target)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值