【找数字、找等值元素】

【找数字】

给一个二维数组nums,对于每一个元素num[i],找出距离最近的且值相等的元素,输出横纵坐标差值的绝对值之和,如果没有等值元素,则输出 -1

输入描述

输入第一行为二维数组的行
输入第二行为二维数组的列
输入的数字以空格隔开。

输出描述

数组形式返回所有坐标值。

解题: 

1.先遍历将相同数字的坐标放在一块

2,再次遍历,求出最小坐标和

rows = int(input())
cols = int(input())
d = {}
ret = []
l = []
for i in range(rows):
    s = list(map(int,input().split()))
    l.append(s)
    for j in range(cols):
        if s[j] not in d:
            d[s[j]] = [(i,j)]
        else:
            a = d[s[j]]
            a.append((i, j))
            d[s[j]] = a
#{0: [(0, 0)], 3: [(0, 1), (1, 4)], 5: [(0, 2), (1, 1), (2, 1)], 4: [(0, 3), (2, 2), (2, 4)], 2: [(0, 4), (1, 0), (2, 0), (2, 3)], 7: [(1, 2)], 8: [(1, 3)]}
print(d)
for i in range(rows):
    for j in range(cols):
        k = l[i][j]
        mds = None
        for ii,jj in d[k]:
            # 代表不是元素本身
            if i != ii or j != jj:
                ds = abs(ii - i) + abs(jj-j)
                if mds is None:
                    mds = ds
                else:
                    mds = min(mds,ds)
        l[i][j] = -1 if mds is None else mds
print(l)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值