2011-12-28 8 views
1

Вот как я решить эту проблему:Подсчитайте общее количество пар чисел, которые имеют разность K

void solve (int *input, int N, int K, int& count) { 
    std::sort (input, input + N); 
    for (int i = 0; i < N; i++) { 
     int find_me = input[i] + K; 
     if (std::binary_search (input + i + 1, input + N, find_me)) 
      count++;   
     else 
      break; 
    } 
} 

input имеет integer значения, которое гарантированно будет unique и > 0, N является количество элементов ,

Кто-нибудь видит что-то не так с этим кодом, я представил это одному из соревнований по программированию, а бот говорит, что несколько тестовых случаев потерпели неудачу, я хочу знать, какой возможный тестовый пример может привести к его повреждению.

+1

«Можете ли вы определить, что не так с моим кодом?» на самом деле не является подходящим вопросом для SO ... –

+0

Но, 'count' инициализирован до нуля? –

+0

@ Oli Charlesworth: да инициализируется 0 – Avinash

ответ

2

Я не уверен, правильно ли я понял коды, но мне кажется, что если в массиве не существует числа со значением input, ваш цикл будет завершен с этим break. Я думаю, вот в чем проблема.

+0

Предположим, что мой вход 1 5 3 4 2, я сортирую его первым, так что становится 1 2 3 4 5, теперь, если мои K = 2, 1 + 2 = 3, 2 + 2 = 4, 3 + 2 = 5 найдено но когда дело доходит до 4 + 2 = 6, он потерпит неудачу и остановится. – Avinash

+0

@Avinash Что делать, если ваш вход 1 5 4 2? Сортировка будет 1 2 4 5, а затем, если ваш K = 2, 1 + 2 = 3, он не найдет 3 в массиве, а затем сработает и остановится. Однако, очевидно, в массиве есть пара (2,4). – derekhh

+0

Также не забудьте указать ошибку «один конец прошлого» в цикле for, о котором я упоминал в своем ответе. –

1

Есть две проблемы с вашим кодом. Во-первых, часть else break;if должна уйти, чтобы избежать преждевременного выхода из цикла for. Во-вторых, вы запускаете один за концом цикла на последней итерации. Условие завершения цикла должно быть i < N - 1.

Однако, поскольку элементы отсортированы, кажется вероятным, что существует алгоритм линейной сложности, который вы могли бы использовать, подобно алгоритму пересечения множества, в котором вы выполняете два индекса самостоятельно, делая проверки.

Смежные вопросы