【问题标题】:Given an array of N integers, and an integer K, find the number of pairs of elements in the array whose sum is equal to K给定一个包含 N 个整数的数组和一个整数 K,找出数组中总和等于 K 的元素对的数量
【发布时间】:2021-12-09 16:59:02
【问题描述】:

问题陈述:- 给定一个由 N 个整数组成的数组和一个整数 K,找出数组中总和等于 K 的元素对的数量。

**def countpairs(x,length,sum):
    count = 0
    for i in range(0,length):
       for j in range(i+1,length):
            print(x[i],x[j])   
            if(x[i]+x[j]==sum):
                count+=1
    print(count)


x  = [1, 1, 1, 1]
sum = 2
length=len(x)
countpairs(x,length,sum)
Output:= 6**
This is My solution used in VS code.

我的问题:- 每当我在 gfg 中运行相同的代码时,它不接受给我这个错误的代码。我什至在在线编译器中尝试了相同的代码,它也运行正常。

This Is the gfg code which i have written 
class Solution:
    def getPairsCount(self, arr, K, N):
        count = 0
        for i in range(0,N):
           for j in range(i+1,N): 
                if(arr[i]+arr[j]==K):
                    count+=1
        return count


#Initial Template for Python 3

if __name__ == '__main__':
    tc = int(input())
    while tc > 0:
        n, k = list(map(int, input().strip().split()))
        arr = list(map(int, input().strip().split()))
        ob = Solution()
        ans = ob.getPairsCount(arr, n, k)
        print(ans)
        tc -= 1


Error
if(arr[i]+arr[j]==K):
IndexError: list index out of range

【问题讨论】:

  • 您将参数arr, n, k 传递给参数为arr, K, N 的函数;这给出了 indexerror。
  • 参数名可以不一样,如果是argumnet的问题,在vs code里就不行了。
  • 我知道参数名称和参数名称可以不同。我的意思是这个问题是由拼写错误引起的。你的 'vscode' 和其他代码 sn-p 完全不同,只有一个有这种交换 n 和 k 的错字
  • @kcsquared 明白了
  • gfg代码中的gfg是什么?

标签: python loops


【解决方案1】:

为此使用类没有任何附加价值。你只需要:-

def getPairsCount(arr, K):
  count = 0
  for i in range(len(arr)-1):
    if arr[i] + arr[i+1] == K:
      count += 1
  return count

编辑:

之前的答案假设只考虑相邻元素。如果不是这种情况,那么试试这个:-

import itertools

def getPairsCount(arr, K):
    count = 0
    for c in itertools.combinations(sorted(arr), 2):
        if c[0] + c[1] == K:
            count += 1
    return count

data = [1, 2, 1, 4, -1]
print(getPairsCount(data, 3))

【讨论】:

  • 这给出的输出为:= 0
  • 它返回的内容取决于您传递给它的数据。例如 getPairsCount([1, 2, 1, 4, -1], 3) 我认为应该返回 3
  • 我将“一对元素”解释为两个相邻的元素。也许如果这个问题不是那么模棱两可,我可能已经提出了一个可行的解决方案。也许我对英语的理解没有想象中那么好
  • 好的,我将删除我对错误答案的评论。我认为在那种情况下它是模棱两可的,也许你是对的@DarkKnight。但是顺便说一句,OP 比较了所有对,似乎它是任何一对,而不仅仅是相邻的
  • 感谢编辑!是的,这样更清楚了
【解决方案2】:

这个问题不需要两个循环。这是在O(n) 中运行的内容:

def countpairs(list_,K):
    count = 0
    set_ = set(list_)
    pairs_ = []
    
    for val in list_:
        if K - val in set_:
            # we ensure that pairs are unordered by using min and max
            pairs_.append ( (min(val, K-val), max(val, K-val)) )
            count+=1

    set_pairs = set(pairs_)
    
    print ("Pairs which sum up to ",K," are: ", set_pairs)

    return len(set_pairs)




x  = [1,4,5,8,2,0,24,7,6]
sum_ = 13
print ("Total count of pairs summming up to ", sum_, " = ", countpairs(x, sum_))

输出:

Pairs which sum up to  13  are:  {(6, 7), (5, 8)}
Total count of pairs summming up to  13  =  2

这个想法是,如果两个值的总和应为值K,我们可以遍历数组并检查数组中是否有另一个元素与当前元素配对时,总和为K。解决方案中的内部循环可以替换为使用 in 的搜索。现在,我们需要快速搜索(O(1) per element),因此我们从输入数组(在我的示例中为set_)创建一个集合。

【讨论】:

  • 5,8 和 8,5 对肯定(实际上)是相同的。我认为使用您的数据对原始问题的答案应该是 2
  • 是的,确实如此。感谢您的强调!如果 a,b 和 b,a 不同,我将添加一个编辑,
  • 完成;我使用 min 和 max 来确保删除排序
  • 这个问题是模棱两可的,但是这个问题通常是如何呈现的,在数组中出现多次的元素被计算多次,例如([5,5,8], 13) 的答案是 2
【解决方案3】:
def solve(a,K):
    freq = {}
    for v in a:
        if v in freq:
            freq[v] += 1
        else:
            freq[v] = 1
    for i in range(len(set(a))):
        res += freq[a[i]] * freq[K - a[i]]
    return res

a = [int(v) for v in input().split()]
K = int(input())
print(solve(a,K))

【讨论】:

    【解决方案4】:
    def solve(a,K):
        freq = {}
        for v in a:
            if v in freq:
                freq[v] += 1
            else:
                freq[v] = 1
        for i in range(len(set(a))):
            res += freq[a[i]] * freq[K - a[i]]
        return res 
    
    a = [int(v) for v in input().split()]
    K = int(input())
    print(solve(a,K))
    # Time Complexity : O(N)
    # Space Complexity : O(1)
    

    【讨论】:

      猜你喜欢
      • 2019-09-19
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      相关资源
      最近更新 更多