Python程序找到一个三元组,使得两个之和等于第三个元素
给定一个整数数组,你必须找到三个数字,使得两个元素的和等于第三个元素。
例子:
Input: {5, 32, 1, 7, 10, 50, 19, 21, 2}
Output: 21, 2, 19
Input: {5, 32, 1, 7, 10, 50, 19, 21, 0}
Output: no such triplet exist
问题来源:Arcesium 面试经历 | Set 7 (校内实习)
简单的方法:运行三个循环并检查是否存在一个三元组,使得两个元素的和等于第三个元素。
时间复杂度:O(n^3)
高效方法:这个想法类似于 Find a triplet that sum to a given value。
- 首先对给定的数组进行排序。
- 从后面开始固定三个中最大的元素并遍历数组以找到其他两个数的总和为第三个元素。
- 取两个指针 j(从前面)和 k(最初为 i-1)找到两个数字中的最小者,并从 i-1 找到剩余两个数字中的最大者
- 如果两个数之和仍然小于A[i],那么我们需要增加两个数之和的值,从而增加j指针,从而增加A[j] + A[的值ķ] 。
- 如果两个数之和大于A[i],那么我们需要减小两个数之和的值,从而减小k指针,从而减小A[j] + A[k的总和] .
下图是上述方法的试运行:
下面是上述方法的实现:
Python
# Python program to find three numbers
# such that sum of two makes the
# third element in array
# Utility function for finding
# triplet in array
def findTriplet(arr, n):
# Sort the array
arr.sort()
# For every element in arr check
# if a pair exist(in array) whose
# sum is equal to arr element
i = n - 1
while(i >= 0):
j = 0
k = i - 1
while (j < k):
if (arr[i] == arr[j] + arr[k]):
# Pair found
print "numbers are ", arr[i],
arr[j], arr[k]
return
elif (arr[i] > arr[j] + arr[k]):
j += 1
else:
k -= 1
i -= 1
# No such triplet is found in array
print "No such triplet exists"
# Driver code
arr = [5, 32, 1, 7, 10, 50, 19, 21, 2]
n = len(arr)
findTriplet(arr, n)
# This code is contributed by Sachin Bisht
输出:
numbers are 21 2 19
时间复杂度:O(N^2)
有关更多详细信息,请参阅有关查找三元组的完整文章,以使两个之和等于第三个元素!