Python3程序打印形成AP的排序数组中的所有三元组
给定一个不同正整数的排序数组,打印所有形成 AP(或算术级数)的三元组
例子 :
Input : arr[] = { 2, 6, 9, 12, 17, 22, 31, 32, 35, 42 };
Output :
6 9 12
2 12 22
12 17 22
2 17 32
12 22 32
9 22 35
2 22 42
22 32 42
Input : arr[] = { 3, 5, 6, 7, 8, 10, 12};
Output :
3 5 7
5 6 7
6 7 8
6 8 10
8 10 12
一个简单的解决方案是运行三个嵌套循环来生成所有三元组,并为每个三元组检查它是否形成 AP。该解决方案的时间复杂度为 O(n 3 )
更好的解决方案是使用散列。我们从左到右遍历数组。我们将每个元素视为中间元素,将其之后的所有元素视为下一个元素。为了搜索前一个元素,我们使用哈希表。
Python3
# Python program to print all
# triplets in given array
# that form Arithmetic
# Progression
# Function to print
# all triplets in
# given sorted array
# that forms AP
def printAllAPTriplets(arr, n) :
s = [];
for i in range(0, n - 1) :
for j in range(i + 1, n) :
# Use hash to find if
# there is a previous
# element with difference
# equal to arr[j] - arr[i]
diff = arr[j] - arr[i];
if ((arr[i] - diff) in arr) :
print ("{} {} {}" .
format((arr[i] - diff),
arr[i], arr[j]),
end = "
");
s.append(arr[i]);
# Driver code
arr = [2, 6, 9, 12, 17,
22, 31, 32, 35, 42];
n = len(arr);
printAllAPTriplets(arr, n);
# This code is contributed by
# Manish Shaw(manishshaw1)
Python 3
# python 3 program to print all triplets in given
# array that form Arithmetic Progression
# Function to print all triplets in
# given sorted array that forms AP
def printAllAPTriplets(arr, n):
for i in range(1, n - 1):
# Search other two elements of
# AP with arr[i] as middle.
j = i - 1
k = i + 1
while(j >= 0 and k < n ):
# if a triplet is found
if (arr[j] + arr[k] == 2 * arr[i]):
print(arr[j], "", arr[i], "", arr[k])
# Since elements are distinct,
# arr[k] and arr[j] cannot form
# any more triplets with arr[i]
k += 1
j -= 1
# If middle element is more move to
# higher side, else move lower side.
elif (arr[j] + arr[k] < 2 * arr[i]):
k += 1
else:
j -= 1
# Driver code
arr = [ 2, 6, 9, 12, 17,
22, 31, 32, 35, 42 ]
n = len(arr)
printAllAPTriplets(arr, n)
# This article is contributed
# by Smitha Dinesh Semwal
输出 :
6 9 12
2 12 22
12 17 22
2 17 32
12 22 32
9 22 35
2 22 42
22 32 42
时间复杂度: O(n 2 )
辅助空间: O(n)
一个有效的解决方案是基于数组已排序的事实。我们使用与 GP 三元组问题中讨论的相同概念。这个想法是从第二个元素开始,将每个元素固定为中间元素,并在三元组中搜索其他两个元素(一个小一个大)。
下面是上述思想的实现。
Python3
# python 3 program to print all triplets in given
# array that form Arithmetic Progression
# Function to print all triplets in
# given sorted array that forms AP
def printAllAPTriplets(arr, n):
for i in range(1, n - 1):
# Search other two elements of
# AP with arr[i] as middle.
j = i - 1
k = i + 1
while(j >= 0 and k < n ):
# if a triplet is found
if (arr[j] + arr[k] == 2 * arr[i]):
print(arr[j], "", arr[i], "", arr[k])
# Since elements are distinct,
# arr[k] and arr[j] cannot form
# any more triplets with arr[i]
k += 1
j -= 1
# If middle element is more move to
# higher side, else move lower side.
elif (arr[j] + arr[k] < 2 * arr[i]):
k += 1
else:
j -= 1
# Driver code
arr = [ 2, 6, 9, 12, 17,
22, 31, 32, 35, 42 ]
n = len(arr)
printAllAPTriplets(arr, n)
# This article is contributed
# by Smitha Dinesh Semwal
输出 :
6 9 12
2 12 22
12 17 22
2 17 32
12 22 32
9 22 35
2 22 42
22 32 42
时间复杂度: O(n 2 )
辅助空间: O(1)
有关详细信息,请参阅完整的文章在形成 AP 的排序数组中打印所有三元组!