昨天我接到了这个问题的任务,从那时起我就试图找到一个有效的解决方案。
解决方案的细节是:给定两个数组a [n],b [n],找到一个对(a [i],b [j]),以便abs(a [i] + b [j])尽可能小。这两个数组由整数元素组成,不超过10亿,这里n至多为10000.
我知道一个由两个for循环组成的解决方案是不实用的,因为数组的大小小于或等于10000.
I我正在考虑一种解决方案,我将以某种方式对这些元素进行排序,这是我尚未发现的,因此我们可以很容易地找出绝对值最小的和,因为我的课正在学习排序算法。
你能帮我弄清楚这里的方式吗?
PS:对不起,我无法在这里输入数学符号。给定两个相同大小的数组,找到两个数组中的几个元素,它们与最小的绝对值进行求和
回答
我有一个Python
代码,在O(nlogn + mlogm) + O(m+n)
= O(nlogn + mlogm)
时间,其中n
是第一阵列的长度和m
是所述第二阵列的长度解决该问题。下面是代码:
arr1.sort()
arr2.sort(reverse = True)
n = len(arr1)
m = len(arr2)
print arr1
print arr2
minim = abs(arr1[0] + arr2[0])
i = 0
j = 0
while i<n and j<m:
minimum = abs(arr1[i] + arr2[j])
minim = min(minim,minimum)
if arr1[i]>0 and arr2[j]>0:
j += 1
elif arr1[i]<=0 and arr2[j]<=0:
i += 1
elif arr1[i]>0 and arr2[j]<=0:
if abs(arr1[i]) > abs(arr2[j]):
j += 1
else:
i += 1
elif arr1[i]<=0 and arr2[j]>0:
if abs(arr1[i]) > abs(arr2[j]):
i += 1
else:
j += 1
print minim
实施例:
arr1[] = [-23, -10, 30, 44, 45]
arr2[] = [61, 55, 32, 22, -55]
答案:1
您可以否定其中一个列表并将其与其他列表一起排序。在这个新的列表中,您可以查找两个连续的最小距离的条目,并且这两个条目是每个原始列表中的一个条目。
如果a[i], i=0,1,...,n
是第一个,而b[j], j=0,1,...,n
是第二个,那么min(|a[k]+b[l]|)=min(|a[k]-(-b[l])|)
。因此,对于某些k,l
,我们可以将a[k]
和b[l]
的总和最小化,而对于某些k,l
,我们可以最小化a[k]
和-b[l]
之间的差异。所以我们寻找一对a[k]
,-b[l]
尽可能接近。这样的一对必须在从对i,j=0,1,...,n
进行排序a[i], -b[j]
获得的列表中连续成为长度为2n
的单个列表c[t]
。
排序c
是O(n日志n),运行通过c
是O(n),所以运行时间是由排序占主导地位。
如果没有连续的数字出现,那么其中一个数字来自array1,另一个来自数组2? –
@User_Targaryen这不可能发生,因为组合列表是线性排序的。如果从排序array1和-array2获得的组合列表array3中的最小条目来自他的第一个数组,则-array2中的最小条目必须出现在某个索引i> 0处。然后array3 [i-1]和array3 [i]是一对连续的条目,一个来自array1,一个来自array2。一个类似的参数工作它是array3中最小的条目来自-array2。然而,这一对并不一定是距离最近的那一对。 – asp
设'a = [1,2,3,4,5]'和'b = [6,7,8]',所以最终答案= 1。通过你的方法,你的第三个数组看起来像'[-8 ,-7,-6,1,2,3,4,5]'。现在,你如何通过你的方法找到答案为'1'?请解释 –
- 1. 两个数组中最大的元素
- 2. 将一个数组划分为两个相等大小的子集,它们的总和差值最小
- 3. 找到不同行中的两个单元格的最小值
- 4. 如何找到一个数组的最大值和最小值
- 5. 在MIPS中查找10个元素数组的最大值和最小值
- 6. 找到两个不同大小的数组
- 7. 匹配两个numpy数组以找到相同的元素
- 8. C++从两个相同大小的不同整数数组中求最小商数
- 9. 查找数组中的最小元素,它有一个模式
- 10. 在大小为N的数组的每k个元素中查找最小元素和第二小元素
- 11. 从数组中删除任何一个元素后,将奇数大小的数组分成两组相等大小和相同的总和
- 12. 查找数组中两个最小值的索引
- 13. 在数组中找到两个相邻数之间的最小数字
- 14. 我必须找到没有数组的两个最小数字
- 15. 查找给定数组中的两个重复元素
- 16. 给定数组中2个元素之间的最小距离
- 17. 比较两个相同大小的diff数组
- 18. 以相同的大小划分数组,使给定函数的值最小
- 19. 使用HashMap查找两个相等大小的数组中的相似元素的计数
- 20. 编写一个获取两个int数组的方法,这两个int数组的大小相同,并返回一个数组,该数组的总和为
- 21. 查找具有最大和最小元素数的数组
- 22. 如何查找数组中有最小差异的两个元素?
- 23. 找到两个最小的值输入
- 24. 一组元素中的同时最大值和最小值
- 25. 给定两个相同大小的numpy数组,如何在同一位置应用一个函数两对元素?
- 26. 按元素求和几个相等大小的矩阵
- 27. 如何从两个相同大小的数组中构建一个Ruby哈希?
- 28. 给定两个uint8_t数组,计算128个元素的SAD
- 29. 如何找到两个整数类型的最大(大小)?
- 30. 将一组给定的数字N分成两组,使它们的和的差值最小?
我假定的元素是整数? – Adam
您是否需要找到总和最小的两个元素?这就是我的理解。 –
是不是只是min(array_1)+ min(array_2)? –