具有相似元素的对

问题描述 投票:0回答:1

给定一个具有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_
python python-2.7 performance big-o
1个回答
0
投票

主逻辑

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。

© www.soinside.com 2019 - 2024. All rights reserved.