【发布时间】:2019-09-24 06:28:33
【问题描述】:
给定一个包含 N 个整数的数组 A。找到好的三元组
(i, j, k)的数量,其中i、j、k都是不同的索引,例如0 < i , j , k <= N。一个好的三元组(i, j, k)是一个三元组,使得总和,S = A[i] + A[j] + A[k],可被A[i]、A[j]或A[k]之一整除。三元组
(i,j,k)的数组值为(A[i], A[j], A[k])。输入:
N=4 A=[1,2,2,1]输出:
12解释:
S=2+2+1=5只能被三元组中的数字1整除,而数组值1, 1, 2的三元组不是一个好的三元组,因为S = 4可以被所有三个整除。所以有两个三元组(1,2,2)和(2,2,1)。查看作为索引的i,j,k值。因此,有 12 种可能的三元组索引,它们的数组值可以是2、2、1。他们是: (1, 2, 3), (1, 3, 2), (2, 1, 3), (3, 1, 2), (2, 3, 1), (3, 2, 1), (2, 3, 4), (2, 4, 3), (3, 2, 4), (4, 2, 3), (3, 4, 2), (4, 3, 2)。 我试过这个(但我想降低时间复杂度):
def good_triplets (arr, n):
c=0
for i in range(0,n-2):
for j in range(i+1,n-1):
for k in range(j+1,n):
sum=arr[i]+arr[j]+arr[k]
if(sum%arr[i]==0 and sum%arr[j]!=0 and sum%arr[k]!=0):
c=c+1
elif(sum%arr[j]==0 and sum%arr[k]!=0 and sum%arr[i]!=0):
c=c+1
elif(sum%arr[k]==0 and sum%arr[i]!=0 and sum%arr[j]!=0):
c=c+1
return(c*6)
n = int(input())
arr = []
for i in range(n) :
x = int(input())
arr.append(x)
out_ = good_triplets(arr, n)
print (out_)
【问题讨论】:
-
到目前为止你尝试了什么?
-
问题是什么?向我们展示 yozu 到目前为止所做的尝试以及您遇到的问题。
-
使用了 3 个嵌套的 for 循环,然后 if else 条件..由于 3 个嵌套的 for 循环时间复杂度=O(n3)
-
我想要更有效的解决方案而不使用 itertools 组合
-
你的谓词很奇怪。
1 < i , j , k < N表示索引 N 或 1 都不可能,但您在示例中同时使用索引 4 和 1:|