Python 具有相似元素的对

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)

给定一个数组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):
          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