给出具有N个整数A1,A2,...,An的数组A.数组Ai和Aj的两个元素称为相似元素iff Ai = Aj +1或Aj = Ai +1可传递性。如果Ai和Aj相似且Aj和Ak相似,则Ai和Ak也相似。 下面是我的代码,它具有更高的时间复杂度,如何减少它?
def SimilarElementsPairs (A,N):
# Write your code here
count=0
map1=[]
for i in range(0,N):
for j in range(0,N):
if((A[i]==A[j]+1) or (A[j]==A[i]+1)):
count+=1
map1.append((i,j))
for k in range(0,N):
if((((A[i]==A[j]+1) or (A[j]==A[i]+1)) and ((A[k]==A[j]+1) or (A[j]==A[k]+1)))) :
count+=1
map1.append((i,k))
if((((A[i]==A[j]+1) or (A[j]==A[i]+1)) and ((A[j]==A[k]+1) or (A[k]==A[j]+1)))):
count+=1
#map1.append((i,k))
if((((A[i]==A[j]+1) or (A[j]==A[i]+1)) and ((A[k]==A[i]+1) or (A[i]==A[k]+1)))):
count+=1
map1.append((j,k))
list1 = set(map(lambda x: tuple(sorted(x)),map1))
list2=[]
for x,y in list1:
if abs(x-y)>0:
list2.append((x,y))
return len(list2)
N = input()
A = map(int, raw_input().split())
out_ = SimilarElementsPairs(A,N)
print out_
答案 0 :(得分:2)
主要逻辑
static long SimilarElementsPairs(int[] arr, int n){
Arrays.sort(arr);
long sCount=1; //to know the count of total elements
long dCount=1; //to know if any pair is found
long ans=0;
for (int i=1; i<n; i++){
if (arr[i]==arr[i-1]+1)
{
sCount++;
dCount++;
}
else if(arr[i]==arr[i-1])
{
sCount++;
}
else
{
if (sCount>=2 && dCount>=2)
{
ans+=((sCount)*(sCount-1))/2;
}
sCount=1;
dCount=1;
}
}
if (sCount>=2 && dCount>=2){
ans+=((sCount)*(sCount-1))/2;
}
return ans;
}
因此,@ Mohammad_Zeineldeen方法几乎是正确的,但是我们需要在问题中查找相同的元素,因此我在上述方法中所做的工作与他的回答类似,但是我也保留了相同元素的数目。
另一种可行的方法是使用HashMap来保留一个元素的总数,当找到一个对(a [i]和a [i-1])时,再加上a [i-1]的总数] + NC2(组合),其中N是a [i-1]的总数。
Ex:在7 7 8->索引到达8时,它将检查对元素,并发现一个为(a [i] -a [i-1] == 1),并且有两个7因此将要形成的对是:(7,8)和(7,8)请记住,它们的索引不同是不相同的,并且根据传递性,将要形成的另一对将是(7,7)也等于NC2(即2C2-> 1),因此为3。