【问题标题】:Pairs having Similar Elements具有相似元素的对
【发布时间】:2019-09-29 09:49:50
【问题描述】:

给定一个数组 A,有 N 个整数 A1, A2,..., An。如果 Ai =Aj +1 或 Aj= Ai +1,则称数组 Ai 和 Aj 的两个元素相似。此外,相似性如下传递性。如果 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_

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 我已经更新了我的代码,但它提供了 TLE。
  • @khelwood 我更新了缩进。
  • 给我那个 HackerRank 问题的链接,我会以更有效的方式帮助你。

标签: python python-2.7 performance big-o


【解决方案1】:

主逻辑

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(Combination) 其中 N 是 a[i-1] 的总计数。

例如:在 7 7 8 -> 当索引到达 8 时,它会检查 pair 元素并找到一个为 (a[i]-a[i-1]==1) 并且有两个 7因此将形成的对是: (7,8) 和 (7,8) 请记住,它们不相同,因为它们的索引不同,并且将通过传递性形成的另一对将是 (7,7),即也等于 NC2(即 2C2 -> 1),因此这将是 3。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多