php 二维数组中查找,二维数组中的查找

一、给出的是方阵

[[1,6,7,8],

[3,7,8,9],

[9,10,11,12],

[12,13,14,15]]

这种情况非常简单,可知对角线元素应为查找元素,如果target大于对角线上某个元素,那么以此对角线为中心,左边、上边的元素应该都小于target

此时只需要找到一个对角线上的点,当找个一个刚刚好大于target的元素,那么左边和上边进行二分查找即可,python代码如下: # -*- coding:utf-8 -*-

class Solution:

# array 二维列表

def Find(self, target, array):

# write code here

h, w = len(array), len(array[0])

for i in range(min(h, w)):      # 在正方形内对角线查找

if array[i][i] == target:

return True

elif (array[i][i] > target):

for j in range(i): # 这里可以替换成二分查找

if (array[i][j] == target or array[j][i] == target):

return True

return False

考虑到非方阵情况例如

[[1,6,7,8],

[3,7,8,9],

[9,10,11,12],

[12,13,14,15],

[13,14,15,16],

[,18,21,22,23]]

其中array的shape=(6,4)

这时候就不能单一按照对角线考虑,应该将矩阵分块,分成多个小方阵,利用递归的方式现将矩阵分块,然后每一个小方阵按照上述对角线方式查找,python代码如下 # -*- coding:utf-8 -*-

class Solution:

# array 二维列表

def Find(self, target, array):

# write code here

h, w = len(array), len(array[0])

if (h==0 or w==0):

# 递归退出条件,当矩阵不可再分时候,此时为行向量,顺序查找或者二分查找

for i in range(max(h,w)):

if(target == array[i]):

return True

return False

# 如果按照方阵情况查找

for i in range(min(h, w)):      # 在正方形内对角线查找

if array[i][i] == target:

return True

elif (array[i][i] > target):

for j in range(i): # 这里可以查找二分查找

if (array[i][j] == target or array[j][i] == target):

return True

if (h > w): # 如果不是方阵,则递归划分成多个小方阵查找

return self.Find(target, [row[:w] for row in array[i+1:]])

else:

return self.Find(target, [row[i+1:] for row in array[:h]])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值