2016-02-08 2 views
0

Я видел, что этот вопрос задал много. Я получаю, как это работает: мы проверяем сумму первого и последнего. Если эта сумма больше k, то последняя - или если ее меньше k, то сначала ++. Это происходит рекурсивно до тех пор, пока не будет найден первый или последний или сумма k не будет найдена. ** Обратите внимание, что значения в массиве всегда сортируются в порядке возрастания.Рекурсия: Определите, есть ли два элемента в массиве A, сумма которых равна k

Я пытался использовать рекурсию, но всякий раз, когда я запускаю ее, она всегда возвращает «false». Я пробовал массивы всех размеров, и все тестовые примеры возвращают false. например Массив [1 2 3 4 5 6], размер n = 6 и k = 7 возвращает false, когда оно должно быть истинным. Я не могу найти ошибку. Может кто-нибудь, пожалуйста, дать мне указание, где я делаю свою ошибку? И если я не ошибаюсь, это работает в O (n) времени?

public static boolean sum(int[] A, int n, int k) //where k is the sum needed and n the size of the array 
{ 
    if (k <= A[0] || k >= A[n]*2) 
    { 
      return false; 
    } 
    int i = 0; 
    int j = n-1; 
    return sum_Recursion(A, n, k, i, j); 
} 


private static boolean sum_Recursion(int[] A, int n, int k, int i, int j) 
{ 
    if(i == j) 
    { 
     return false; 
    } else if((A[i] + A[j]) == k)  
    { 
     return true; 
    } else if ((A[i] + A[j]) > k) 
    { 
     return sum_Recursion(A, n, k, i, j--); 
    } 
     return sum_Recursion(A, n, k, i++, j); 
} 
+0

Это должно быть O (n), каков минимальный вход, который показывает проблему? Что вы видите, когда пытаетесь отлаживать свой код в своем отладчике? Примечание: 'sum_recursion' не использует' n'. Почему 'j = n - 1'? Что делать, если последнее значение необходимо? –

+0

@PeterLawrey С любыми вводами, то есть я даю ему массив, а затем проверяю его на значения k, которые являются суммой двух целых чисел в этом массиве, а также других k ... во всех случаях он возвращает false. Это никогда не бывает так. n - размер массива (он задается как параметр, поэтому я делаю j = n - 1 для последнего индекса. – RYS221

+0

Если 'n' - это размер массива' A [n] 'всегда будет вызывать исключение Я предлагаю вам использовать 'A.length' как размер массива. –

ответ

3

Две проблемы:

  1. j--, будет использовать J, а затем -. он должен быть j - 1 или --j. Такая же история с i ++.

  2. Параметр n кажется бесполезным. Когда вы его используете, индексируйте границы.

Фиксированной версия с правильным результатом:

public static void main(String[] args) { 
    int[] a = {1, 2, 3, 4, 5, 6}; 
    System.out.println(sum(a, 6, 7)); // ==> true 
} 

public static boolean sum(int[] A, int n, int k) //where k is the sum needed and n the size of the array 
{ 
    if (k <= A[0] || k >= A[n - 1] * 2) { 
     return false; 
    } 
    int i = 0; 
    int j = n - 1; 
    return sum_Recursion(A, n, k, i, j); 
} 


private static boolean sum_Recursion(int[] A, int n, int k, int i, int j) { 
    if (i == j) { 
     return false; 
    } else if ((A[i] + A[j]) == k) { 
     return true; 
    } else if ((A[i] + A[j]) > k) { 
     return sum_Recursion(A, n, k, i, j - 1); 
    } 
    return sum_Recursion(A, n, k, i + 1, j); 
} 
+0

Примечание: ваша версия также найдет -1 + 2 = 1, версия OP предполагает, что никакие значения не являются отрицательными. +1 –

+0

Спасибо. О, это имеет смысл, я должен был это осознать! : | У меня нет выбора о параметре n, нам был дан заголовок метода и он должен заполнить код внутри, используя заданные параметры. Я изменил свой код на i и j, но, к сожалению, он все равно возвращает false. :( – RYS221

+0

@ user156177 Обновлен ответ изменен A [n] * 2 на A [n - 1] * 2. – xfx

0

О (п) Алгоритм:

  1. Вставка элементов массива в хэш-таблицу или HashMap
  2. итерации массива и увидеть k - currentElement присутствует в хеш-структуре данных
Смежные вопросы