计算给定总和的对

时间:2018-10-08 13:51:22

标签: c++ hashtable

给出一个整数数组和一个数字“和”,找到该数组中总和等于“和”的整数对的数量。这是Geeks for Geeks的解决方案:

// C++ implementation of simple method to find count of 
// pairs with given sum. 
#include <bits/stdc++.h> 
using namespace std; 

// Returns number of pairs in arr[0..n-1] with sum equal 
// to 'sum' 
int getPairsCount(int arr[], int n, int sum) 
{ 
    unordered_map<int, int> m; 

    // Store counts of all elements in map m 
    for (int i=0; i<n; i++) 
        m[arr[i]]++; 

    int twice_count = 0; 

    // iterate through each element and increment the 
    // count (Notice that every pair is counted twice) 
    for (int i=0; i<n; i++) 
    { 
        twice_count += m[sum-arr[i]]; 

        // if (arr[i], arr[i]) pair satisfies the condition, 
        // then we need to ensure that the count is 
        // decreased by one such that the (arr[i], arr[i]) 
        // pair is not considered 
        if (sum-arr[i] == arr[i]) 
            twice_count--; 
    } 

    // return the half of twice_count 
    return twice_count/2; 
} 

// Driver function to test the above function 
int main() 
{ 
    int arr[] = {1, 5, 7, -1, 5} ; 
    int n = sizeof(arr)/sizeof(arr[0]); 
    int sum = 6; 
    cout << "Count of pairs is " 
         << getPairsCount(arr, n, sum); 
    return 0; 
} 

我的大问题是,总和是什么?它没有声明,因此必须用C ++构建。但是,我找不到它的任何文档,也不确定它是如何工作的。 我正在尝试遵循代码,并且sum-arr值没有意义。

arr [1,5,8,-1,5]

m [0,1,0,0,0]

sum-arr [5,1,-2,7,1]

2 个答案:

答案 0 :(得分:3)

  

表达式sum - arr[n]产生存储在数组第n个位置的值。

在这里,将n处的arr值(此处是i指向的位置,因为它是arr[i])减去sum的值。

你说,

int arr[] = { 1, 5 , 8, -1, 5 }

int sum = 6

然后,例如,将i设为 0 ...

arr[i]表示为arr[0],这意味着指向数组arr中的第一个元素(0)。在这里,值为1。

从6减去 1 ,我们得到 5

另一方面,sum - arr是用指针(int将变成int arr[]的指针)减去整数(int * arr)的结果,实际上,这是不可能的,因为超级指针大于子指针...

但是,您可以执行sum - *arr(称为取消引用)。

最后的话

仅通过使用指针和所有内容来减少所有这些混乱,只需使用std::vector<type>示例: std::vector<int> arr;),这是C ++中的常见做法,此外,就像他们一样工作! (不过,您仍然坚持使用C语言中的指针!)。

祝你好运!

答案 1 :(得分:2)

  

我的大问题是,总和是什么?

sum是一个id表达式。它命名为int类型的变量。

arr是一个id表达式。它命名为int*类型的另一个变量。它也是表达式arr[i]的子表达式。该表达式是下标运算符,在这种情况下,该运算符将指针arr递增到其在数组中的第i个连续同级,并间接指向该指针。

-是减法运算符。 sum表达式是左操作数,arr[i]是右操作数。