递归:确定数组A中是否有两个元素总和为k

时间:2016-02-08 02:02:26

标签: java arrays algorithm debugging recursion

我已经看到这个问题了很多。我知道它是如何工作的:我们检查第一个和最后一个的总和。如果这个总和大于k,那么最后 - 或者如果它小于k,那么首先是++。这以递归方式进行,直到第一个==最后或者找到总和k。 **请注意,数组中的值始终按升序排序。

我尝试过使用递归,但每当我运行它时,它总是返回“false”。我尝试过所有大小的数组,所有测试用例都返回false。例如数组[1 2 3 4 5 6],大小n = 6且k = 7应该为真时返回false。 我似乎无法找到这个bug。任何人都可以告诉我我犯错的地方吗?如果我没有弄错,这会在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);
}

2 个答案:

答案 0 :(得分:3)

两个问题:

  1. j--将首先使用j,然后使用 - 。它应该是j - 1或--j。与i ++相同的故事。

  2. n参数似乎没用。什么时候使用它,索引出边界。

  3. 修正版本的结果正确:

    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);
    }
    

答案 1 :(得分:0)

O(n)算法:

  1. 将数组元素插入哈希表或哈希映射
  2. 遍历数组并查看哈希数据结构中存在k - currentElement