Подсчитать пары с заданной суммой - PullRequest
0 голосов
/ 08 октября 2018

Учитывая массив целых чисел и число 'sum', найдите количество пар целых чисел в массиве, сумма которых равна 'sum'.Это решение 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; 
} 

Мой большой вопрос: что такое sum-arr?Он не объявлен, поэтому он должен быть встроен в C ++.Тем не менее, я не могу найти какую-либо документацию об этом, и я не уверен, как это работает.Я пытаюсь следовать коду, и это не имеет смысла значения суммы arr.

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

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

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

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Выражение, sum - arr[n], которое возвращает значение, хранящееся в n-й позиции массива.

Здесь значение arr в n (здесь в позиции, где iочков, так как это arr[i]) вычитается со значением sum.

Дано, скажем,

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

и

int sum = 6

Затем, например, принять i как 0 ...

arr[i] представляется как arr[0], что означает указание напервый элемент (0) в массиве arr.Здесь значение равно 1.

И, вычитая 1 из 6 , мы получаем 5 .

С другой стороны, sum - arr равновычитание целого числа (int) с указателем (int arr[] внутри программы станет int * arr), что на самом деле невозможно, поскольку супер-указатель больше, чем под-указатель ...

Однако вы можете сделать, sum - *arr (что называется разыменованием).

Последние слова,

Просто чтобы уменьшить всю эту путаницу с использованием указателей и всего,просто используйте std::vector<type> ( Пример: std::vector<int> arr;), что является распространенной практикой в ​​C ++ и, более того, работает так же, как и они!( Вы все равно используете указатели в C! ).

Удачи!

0 голосов
/ 08 октября 2018

Мой большой вопрос: что такое sum-arr?

sum - это id-выражение.Он называет переменную типа int.

arr - это id-выражение.Он называет другую переменную типа int*.Это также подвыражение выражения arr[i].Это выражение является оператором индекса, который в этом случае увеличивает указатель arr до его i-го последовательного брата в массиве и направляет указатель.

- является оператором вычитания.sum выражение - левый операнд, а arr[i] - правый операнд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...