鱼C论坛

 找回密码
 立即注册
查看: 4009|回复: 62

[已解决]Python:每日一题 347

[复制链接]
发表于 2020-3-9 13:22:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天的题目:


给定两个整数数组 a 和 b,计算具有最小差绝对值的一对数值(每个数组中取一个值),并返回该对数值的差

示例 1:

输入:a = [1, 3, 15, 11, 2],b = [23, 127, 235, 19, 8]
输出:3
解释:11 - 8 = 3
示例 2:

输入:a = [1, 3, 6, 2, 76],b = [77, 5, 10, 9, 8]
输出:1
解释:77 - 76 = 1


欢迎大家一起答题!
最佳答案
2020-3-10 13:24:06

这样呢??
  1. def f347(a, b):
  2.     a, b = set(a), set(b)
  3.     c, d = a & b, sorted(a ^ b)
  4.     if c: return 0
  5.     cout = float('inf')
  6.     for i in range(len(d) - 1):
  7.         k = abs(d[i+1] - d[i])
  8.         if k < cout:
  9.             if (d[i] in a and d[i+1] in b) or (d[i] in b and d[i+1] in a):
  10.                 cout = min(cout, k)
  11.     return cout
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-9 13:33:40 | 显示全部楼层
数组a或者b有重复元素吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-9 13:42:46 | 显示全部楼层
本帖最后由 kinkon 于 2020-3-9 20:30 编辑

先传一个没什么效率的,应该超时了
  1. def f347(a, b):
  2.     cout = abs(a[0]-b[0])
  3.     for i in a:
  4.         for j in b:
  5.             cout = min(abs(j-i), cout)
  6.     return cout
复制代码


加一个缩减版
  1. def f347(a, b):return min([abs(i-j) for i in a for j in b])
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-9 13:43:17 | 显示全部楼层
  1. a = [1, 3, 15, 11, 2]
  2. b = [23, 127, 235, 19, 8]
  3. lena = len(a)
  4. lenb = len(b)
  5. s = abs(a[0] - b[0])
  6. for i in range(lena):
  7.     for j in range(lenb):
  8.         if s > abs(a[i] - b[j]):
  9.             s = abs(a[i] - b[j])
  10. print(s)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-9 13:48:04 | 显示全部楼层
小白暴力破解版来了!!!
  1. a = [1, 3, 15, 11, 2]
  2. b = [23, 127, 235, 19, 8]
  3. c = []
  4. d = []
  5. for each_a in a:
  6.     for each_b in b:
  7.         c.append(each_a - each_b)

  8. for each_c in c:
  9.     if each_c < 0 :
  10.         d.append(-each_c)
  11.     else:
  12.         d.append(each_c)

  13. print(min(d))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-9 13:50:06 | 显示全部楼层
两个数组是不是一样长?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-9 13:50:31 | 显示全部楼层
刚看楼上几位学了个abs函数,改了一下


  1. a = [1, 3, 15, 11, 2]
  2. b = [23, 127, 235, 19, 8]
  3. c = []

  4. for each_a in a:
  5.     for each_b in b:
  6.         c.append(abs(each_a - each_b))
  7.         
  8. print(min(c))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-9 15:03:40 | 显示全部楼层
哎,刚才就编好了,有个错误找了半天,拿不了第一了
  1. def fun347(a,b):
  2.     def twoSplit(element):
  3.         if B[0]>=element:
  4.             return -1,(B[0]-element)
  5.         elif B[M-1] < element:
  6.             return (M-1),min([element-B[M-1],tempMin])
  7.         elif B[prePosition+1]>=element:
  8.             return prePosition,min([element-B[prePosition],B[prePosition+1]-element,tempMin])
  9.         else:
  10.             start = prePosition + 1
  11.             end = M-1
  12.             while True:
  13.                 Mid = (start+end)//2
  14.                 if B[Mid]>=element:
  15.                     end = Mid
  16.                 else:
  17.                     if B[Mid+1]>=element:
  18.                         return Mid,min([element-B[Mid],B[Mid+1]-element,tempMin])
  19.                     else:
  20.                         start = Mid
  21.                
  22.     if len(a) < len(b):
  23.         A = sorted(a)
  24.         B = sorted(b)
  25.     else:
  26.         A = sorted(b)
  27.         B = sorted(a)

  28.     M = len(B)
  29.     prePosition = -1
  30.     tempMin = abs(A[0]-B[0])
  31.     for each in A:
  32.         prePosition,tempMin = twoSplit(each)
  33.         if tempMin == 0:
  34.             break
  35.         elif prePosition == M-1:
  36.             break
  37.     return tempMin
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-9 15:06:32 | 显示全部楼层
  1. def f347(a:list,b:list)->int:
  2.     return min([abs(a[i]-b[j]) for i in range(len(a)) for j in range(len(b))])
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-9 15:31:44 | 显示全部楼层
  1. def fun347(a:list, b:list):
  2.     lenA = len(a)
  3.     lenB = len(b)
  4.     a.sort()
  5.     b.sort()
  6.     Min = max(a[-1], b[-1])
  7.     i = 0
  8.     j = 0
  9.     while((i < lenA) and (j < lenB)):
  10.         Min = min(Min,abs(a[i] - b[j]))
  11.         if(a[i] > b[j]):
  12.             j += 1
  13.         else:
  14.             i += 1
  15.     return Min
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-9 15:32:10 | 显示全部楼层
本帖最后由 flamezyy 于 2020-3-10 01:52 编辑
  1. def f347(a,b):
  2.     def serch(i,b):
  3.         star = 0
  4.         end = len(b) - 1
  5.         index = (end - star) // 2
  6.         while(index == star):
  7.             if i == b[index]:
  8.                 return 0
  9.             elif i > b[index]:
  10.                 star = index
  11.             else:
  12.                 end = index
  13.             index = star + (end - star) // 2
  14.         return min(abs(i-b[star]), abs(i-b[end]))
  15.    
  16.     if len(a) == len(b) == 1:
  17.         return(abs(a[0] - b[0]))
  18.     b.sort()
  19.     result = abs(a[0]-b[0])
  20.     for i in a:
  21.         if i >= b[-1]:
  22.             dif = abs(i - b[-1])
  23.         elif i <= b[0]:
  24.             dif = abs(i - b[0])
  25.         else:
  26.             dif = serch(i,b)
  27.         if dif == 0:
  28.             return 0
  29.         elif result > dif:
  30.             result = dif
  31.     return result
复制代码

这个似乎效率更高一点

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
zltzlt + 4 + 4

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-9 15:41:54 | 显示全部楼层
  1. def f347(a,b):
  2.     t=[(e,0) for e in a]+[(e,1) for e in b]
  3.     t.sort(key=lambda x:x[0])
  4.     m=abs(a[0]-b[0])
  5.     for i in range(len(t)-1):
  6.         if t[i][1]!=t[i+1][1]:
  7.             m=min(m,t[i+1][0]-t[i][0])
  8.             if not m:
  9.                 return 0
  10.     return m
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-9 15:54:41 | 显示全部楼层
本帖最后由 均昊山 于 2020-3-9 16:00 编辑

a =[1,3,15,11,2]
b =[23,127,235,19,8]
yaoqiu = int(input(""))
for op in a:
    for cp in b:
        if op > cp:
            
            if yaoqiu == (op - cp):
                 print (op,cp)
        else:
           if yaoqiu == (cp - op):
               print (cp,op)
            如题没注明两数组值相同的话可以试试这个串懒码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
zltzlt + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-9 16:26:26 | 显示全部楼层
  1. from bisect import bisect
  2. def fun347(a,b):
  3.     a.sort()
  4.     b.sort()
  5.     result=[]
  6.     for i in b:
  7.         index=bisect(a,i)
  8.         if index<=len(a)-1:
  9.             result.append(min(abs(a[index-1]-i),abs(a[index]-i)))
  10.         elif index==len(a):
  11.             result.append(abs(a[index-1]-i))
  12.             break
  13.     return sorted(result)[0]
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-9 16:39:27 | 显示全部楼层
本帖最后由 kinkon 于 2020-3-9 20:22 编辑

感觉还是要超时...
  1. def pu347(a, b):
  2.     c, d = set(a) & set(b), sorted(set(a) ^ set(b))
  3.     if c: return 0
  4.     cout = abs(a[0] - b[0])
  5.     for i in range(len(d) - 1):
  6.         k = abs(d[i+1] - d[i])
  7.         if k < cout:
  8.             if (d[i] in a and d[i+1] in b) or (d[i] in b and d[i+1] in a):
  9.                 cout = min(cout, k)
  10.     return cout
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
zltzlt + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-9 16:55:32 | 显示全部楼层

a = [1, 3, 6, 2, 76]
b = [77, 5, 10, 9, 8]

def minabs(list1,list2):
        min =list1[0]-list2[0]
        if min < 0:
                min = -min
        for i1 in list1[:]:
                for i2 in list2[:]:
                       i=i1-i2
                       if i < 0:
                               i = -i
                       if i < min:
                               min = i
        return min
e =minabs(a,b)
print(e)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-9 17:05:15 | 显示全部楼层
请求楼主测试
  1. def fun347(A, B):
  2.     A.sort()
  3.     B.sort()
  4.     a = 0
  5.     b = 0
  6.     number = 2147483647
  7.     while a < len(A) and b < len(B):
  8.         number = min(number, abs(A[a]-B[b]))
  9.         if A[a] > B[b]:
  10.             b += 1
  11.         elif A[a] < B[b]:
  12.             a += 1
  13.         elif A[a] == B[b]:
  14.             number = 0
  15.             break
  16.     return number
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-9 17:06:21 | 显示全部楼层
  1. def f_347(a, b):
  2.     return min([abs(i-j) for i in a for j in b])

  3. print(f_347([1, 3, 15, 11, 2], [23, 127, 235, 19, 8]))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-9 17:49:35 | 显示全部楼层
  1. def solve(a, b):
  2.     # 将两个序列排列并从小到大合并
  3.     # 最小差值必然出现在合并时两个序列切换的地方
  4.     # 因为不需要合并后的序列 所以只需要记录前一位的值和前一位来自哪个序列即可
  5.     a.sort()
  6.     b.sort()

  7.     i = j = 0
  8.     min_difference = abs(a[0] - b[0])
  9.     if a[i] < b[j]:    # 判断第一位应该取哪个序列
  10.         pre_num = a[i] # 表示前一位的值
  11.         flag = True    # flag = True代表前一位来自a 否则来自b
  12.         i += 1
  13.     else:
  14.         pre_num = b[j]
  15.         flag = False
  16.         j += 1
  17.    
  18.     while (i < len(a)) and (j < len(b)):
  19.         if a[i] < b[j]:
  20.             if not flag:
  21.                 min_difference = min(min_difference, a[i] - pre_num)
  22.             #更新pre_num和flag
  23.             pre_num = a[i]
  24.             i += 1
  25.             flag = True
  26.         else:
  27.             if flag:
  28.                 min_difference = min(min_difference, b[j] - pre_num)
  29.             pre_num = b[j]
  30.             j += 1
  31.             flag = False
  32.     #while结束后一定会有一个序列没有用完
  33.     if (i < len(a)) and not flag:
  34.         min_difference = min(min_difference, a[i])
  35.     elif (j < len(b)) and flag:
  36.         min_difference = min(min_difference, b[j])
  37.     return min_difference
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-9 19:09:25 | 显示全部楼层
  1. def test347(a,b):
  2.     lena=len(a)
  3.     lenb=len(b)
  4.     gaplist=[]
  5.     for i in range(lena):
  6.         for k in range(lenb):
  7.             gap=abs(a[i]-b[k])
  8.             gaplist.append(gap)

  9.     gapmin=min(gaplist)
  10.     return gapmin

  11. a=[1, 3, 15, 11, 2]
  12. b=[23, 127, 235, 19, 8]
  13. gapmin=test347(a,b)         
  14. print(gapmin)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 11:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表