题目标题

求三个升序数组a[l],b[m],c[n]中,每个数组出一个数,要求max(|a[i]-b[j]|,|a[i]-c[k]|,|b[j]-c[k]|)最小。

参考解析
  1. def mins(a,b,c):
  2. mins = a if a < b else b
  3. mins = mins if mins < c else c
  4. return mins
  5. def maxs(a,b,c):
  6. maxs = b if a < b else a
  7. maxs = c if maxs < c else maxs
  8. return maxs
  9. def minDistance(a,b,c):
  10. aLen = len(a)
  11. bLen = len(b)
  12. cLen = len(c)
  13. curDist = 0
  14. minsd = 0
  15. minDist = 2 ** 32
  16. i = 0 #数组a的下标
  17. j = 0 #数组b的下标
  18. k = 0 #数组c的下标
  19. while True:
  20. curDist = maxs(abs(a[i]-b[j]),abs(a[i]-c[k]),abs(b[j]-c[k]))
  21. if curDist < minDist:
  22. minDist = curDist
  23. #找出当前遍历到三个数组中最小值
  24. minsd = mins(a[i],b[j],c[k])
  25. if minsd == a[i]:
  26. i += 1
  27. if i >= aLen:
  28. break
  29. elif minsd == b[j]:
  30. j += 1
  31. if j >= bLen:
  32. break
  33. else:
  34. k += 1
  35. if k >= cLen:
  36. break
  37. return minDist
  38. if __name__ == "__main__":
  39. a = [3,4,5,7,15]
  40. b = [10,12,14,16,17]
  41. c = [20,21,23,24,37,30]
  42. print("最小距离为:"+str(minDistance(a,b,c)))

推荐习题

二叉搜索树中删除指定节点 给定数组{a1, a2, a3, ... an},要求挑出一些数,这些数不能相邻,使得加起来的和最大。 字符串翻转 有一个木棍长度为n个单位,上面有若干只蚂蚁。蚂蚁只能沿着它朝左或者朝右走。速度为1个每秒一个单位。如果两只走的方向不同的蚂蚁相遇,则它们都会调头,朝相反方向以同样的速度继续走。给定所有蚂蚁的位置,求最后一只蚂蚁掉下棍子的时间。 数据范围:木棍长度n :正整数 1 <= n <= 10000 每只蚂蚁的位置和走的方向,两个非负整数数组left[], right[] 每个数组长度为[0, n + 1]之间的整数。两个数组长度总和是[1, n + 1]之间的整数,在两个数组里,没有整数重复出现。(位置表示是非负整数[0..n]之间。的同一个位置不会有两只蚂蚁。总体上,至少存在一只蚂蚁。) 例如 输入:n = 4, left = {4,3}, right = {0,1}, 答案是4……自己分析下就好。 ![](https://pupload.chinahadoop.cn/program/20201102/8587d7b20eef5b686539bd2430d3afc7.png) 如何在O(1)时间删除链表节点 二叉树的最近公共父亲节点 在从1到n的正数中1出现的次数----输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。 例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次 Python中列表,元组的相同之处及区别都有哪些?集合与字典呢?