Python 具有相似元素的对
给定一个数组A,它有N个整数A1,A2,…,an。数组Ai和Aj的两个元素被称为相似的iff Ai=Aj+1或Aj=Ai+1,相似性遵循传递性。如果Ai和Aj相似,Aj和Ak相似,那么Ai和Ak也相似下面是我的代码,时间复杂度更高,我们如何降低它?Python 具有相似元素的对,python,python-2.7,performance,big-o,Python,Python 2.7,Performance,Big O,给定一个数组A,它有N个整数A1,A2,…,an。数组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)
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_
主要逻辑
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;
}
静态长相似元素空间(int[]arr,int n){
数组。排序(arr);
long Scont=1;//了解元素总数
long dCount=1;//了解是否找到任何对
长ans=0;
对于(int i=1;i=2&&dCount>=2)
{
ans+=((童子军)*(童子军-1))/2;
}
Scont=1;
dCount=1;
}
}
如果(搜索数>=2&&D计数>=2){
ans+=((童子军)*(童子军-1))/2;
}
返回ans;
}
所以@Mohammad_Zeineldeen方法几乎是正确的,但我们需要在问题中寻找相同的元素,因此我在上述方法中所做的与他的答案类似,但我也保留了相同元素的数量
另一种可行的方法是使用HashMap来保持元素的总计数,当找到一对(a[i]&a[i-1])时,将a[i-1]+NC2(组合)的总计数相加,其中N是a[i-1]的总计数
例:在7 7 8->当索引到达8时,它将检查pair元素,并将发现一个为(a[i]-a[i-1]==1),并且由于有两个7 so对将形成:(7,8)和(7,8)请记住,它们不相同,因为它们的索引不同,将形成的另一对是(7,7)通过传递性,它也等于NC2(即2C2->1),因此和对于这将是3。到目前为止,你尝试了什么?我已经更新了我的代码,但它给出了TLE。@khelwood我更新了缩进。给我到HackerRank问题的链接,我将以更有效的方式帮助你。@Alok