给出一个整数数组和一个数字“和”,找到该数组中总和等于“和”的整数对的数量。这是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]
答案 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]
是右操作数。