鱼C论坛

 找回密码
 立即注册
查看: 5626|回复: 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

这样呢??
def f347(a, b):
    a, b = set(a), set(b)
    c, d = a & b, sorted(a ^ b)
    if c: return 0
    cout = float('inf')
    for i in range(len(d) - 1):
        k = abs(d[i+1] - d[zxsq-anti-bbcode-i])
        if k < cout:
            if (d[zxsq-anti-bbcode-i] in a and d[i+1] in b) or (d[zxsq-anti-bbcode-i] in b and d[i+1] in a):
                cout = min(cout, k)
    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 编辑

先传一个没什么效率的,应该超时了
def f347(a, b):
    cout = abs(a[0]-b[0])
    for i in a:
        for j in b:
            cout = min(abs(j-i), cout)
    return cout

加一个缩减版
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 | 显示全部楼层
a = [1, 3, 15, 11, 2]
b = [23, 127, 235, 19, 8]
lena = len(a)
lenb = len(b)
s = abs(a[0] - b[0]) 
for i in range(lena):
    for j in range(lenb):
        if s > abs(a[i] - b[j]):
            s = abs(a[i] - b[j])
print(s)

评分

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

查看全部评分

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

使用道具 举报

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

for each_c in c:
    if each_c < 0 :
        d.append(-each_c)
    else:
        d.append(each_c)

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

使用道具 举报

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

使用道具 举报

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

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

for each_a in a:
    for each_b in b:
        c.append(abs(each_a - each_b))
        
print(min(c))

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-9 15:03:40 | 显示全部楼层
哎,刚才就编好了,有个错误找了半天,拿不了第一了
def fun347(a,b):
    def twoSplit(element):
        if B[0]>=element:
            return -1,(B[0]-element)
        elif B[M-1] < element:
            return (M-1),min([element-B[M-1],tempMin])
        elif B[prePosition+1]>=element:
            return prePosition,min([element-B[prePosition],B[prePosition+1]-element,tempMin])
        else:
            start = prePosition + 1
            end = M-1
            while True:
                Mid = (start+end)//2
                if B[Mid]>=element:
                    end = Mid
                else:
                    if B[Mid+1]>=element:
                        return Mid,min([element-B[Mid],B[Mid+1]-element,tempMin])
                    else:
                        start = Mid
                
    if len(a) < len(b):
        A = sorted(a)
        B = sorted(b)
    else:
        A = sorted(b)
        B = sorted(a)

    M = len(B)
    prePosition = -1
    tempMin = abs(A[0]-B[0])
    for each in A:
        prePosition,tempMin = twoSplit(each)
        if tempMin == 0:
            break
        elif prePosition == M-1:
            break
    return tempMin

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-9 15:06:32 | 显示全部楼层
def f347(a:list,b:list)->int:
    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 | 显示全部楼层
def fun347(a:list, b:list):
    lenA = len(a)
    lenB = len(b)
    a.sort()
    b.sort()
    Min = max(a[-1], b[-1])
    i = 0
    j = 0
    while((i < lenA) and (j < lenB)):
        Min = min(Min,abs(a[i] - b[j]))
        if(a[i] > b[j]):
            j += 1
        else:
            i += 1
    return Min

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-9 15:32:10 | 显示全部楼层
本帖最后由 flamezyy 于 2020-3-10 01:52 编辑
def f347(a,b):
    def serch(i,b):
        star = 0
        end = len(b) - 1
        index = (end - star) // 2
        while(index == star):
            if i == b[index]:
                return 0
            elif i > b[index]:
                star = index
            else:
                end = index
            index = star + (end - star) // 2
        return min(abs(i-b[star]), abs(i-b[end]))
    
    if len(a) == len(b) == 1:
        return(abs(a[0] - b[0]))
    b.sort()
    result = abs(a[0]-b[0])
    for i in a:
        if i >= b[-1]:
            dif = abs(i - b[-1])
        elif i <= b[0]:
            dif = abs(i - b[0])
        else:
            dif = serch(i,b)
        if dif == 0:
            return 0
        elif result > dif:
            result = dif
    return result
这个似乎效率更高一点

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-9 15:41:54 | 显示全部楼层
def f347(a,b):
    t=[(e,0) for e in a]+[(e,1) for e in b]
    t.sort(key=lambda x:x[0])
    m=abs(a[0]-b[0])
    for i in range(len(t)-1):
        if t[i][1]!=t[i+1][1]:
            m=min(m,t[i+1][0]-t[i][0])
            if not m:
                return 0
    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 | 显示全部楼层
from bisect import bisect
def fun347(a,b):
    a.sort()
    b.sort()
    result=[]
    for i in b:
        index=bisect(a,i)
        if index<=len(a)-1:
            result.append(min(abs(a[index-1]-i),abs(a[index]-i)))
        elif index==len(a):
            result.append(abs(a[index-1]-i))
            break
    return sorted(result)[0]

评分

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

查看全部评分

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

使用道具 举报

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

感觉还是要超时...
def pu347(a, b):
    c, d = set(a) & set(b), sorted(set(a) ^ set(b))
    if c: return 0
    cout = abs(a[0] - b[0])
    for i in range(len(d) - 1): 
        k = abs(d[i+1] - d[i])
        if k < cout:
            if (d[i] in a and d[i+1] in b) or (d[i] in b and d[i+1] in a): 
                cout = min(cout, k)
    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 | 显示全部楼层
请求楼主测试
def fun347(A, B):
    A.sort()
    B.sort()
    a = 0
    b = 0
    number = 2147483647
    while a < len(A) and b < len(B):
        number = min(number, abs(A[a]-B[b]))
        if A[a] > B[b]:
            b += 1
        elif A[a] < B[b]:
            a += 1
        elif A[a] == B[b]:
            number = 0
            break
    return number

评分

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

查看全部评分

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

使用道具 举报

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

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 | 显示全部楼层
def solve(a, b):
    # 将两个序列排列并从小到大合并
    # 最小差值必然出现在合并时两个序列切换的地方
    # 因为不需要合并后的序列 所以只需要记录前一位的值和前一位来自哪个序列即可
    a.sort()
    b.sort()

    i = j = 0
    min_difference = abs(a[0] - b[0])
    if a[i] < b[j]:    # 判断第一位应该取哪个序列
        pre_num = a[i] # 表示前一位的值
        flag = True    # flag = True代表前一位来自a 否则来自b
        i += 1
    else:
        pre_num = b[j]
        flag = False
        j += 1
    
    while (i < len(a)) and (j < len(b)):
        if a[i] < b[j]:
            if not flag:
                min_difference = min(min_difference, a[i] - pre_num)
            #更新pre_num和flag 
            pre_num = a[i]
            i += 1
            flag = True
        else:
            if flag:
                min_difference = min(min_difference, b[j] - pre_num)
            pre_num = b[j]
            j += 1
            flag = False
    #while结束后一定会有一个序列没有用完 
    if (i < len(a)) and not flag:
        min_difference = min(min_difference, a[i])
    elif (j < len(b)) and flag:
        min_difference = min(min_difference, b[j])
    return min_difference

评分

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

查看全部评分

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

使用道具 举报

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

    gapmin=min(gaplist)
    return gapmin

a=[1, 3, 15, 11, 2]
b=[23, 127, 235, 19, 8]
gapmin=test347(a,b)         
print(gapmin)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 16:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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