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

Java 递归:确定数组A中是否有两个元素和k之和,java,arrays,algorithm,debugging,recursion,Java,Arrays,Algorithm,Debugging,Recursion,我见过很多人问这个问题。我知道它是如何工作的:我们检查第一个和最后一个的总和。如果这个总和大于k,那么最后一个-,或者如果它小于k,那么第一个++。这将递归进行,直到找到first==last或求和k为止。 **请注意,数组中的值始终已按升序排序 我尝试过使用递归,但每当我运行它时,它总是返回“false”。我尝试过各种大小的数组,所有测试用例都返回false。e、 数组[1 2 3 4 5 6],大小n=6和k=7在应该为真时返回false。 我似乎找不到那只虫子。谁能告诉我我在哪里犯了错吗?

我见过很多人问这个问题。我知道它是如何工作的:我们检查第一个和最后一个的总和。如果这个总和大于k,那么最后一个-,或者如果它小于k,那么第一个++。这将递归进行,直到找到first==last或求和k为止。 **请注意,数组中的值始终已按升序排序

我尝试过使用递归,但每当我运行它时,它总是返回“false”。我尝试过各种大小的数组,所有测试用例都返回false。e、 数组[1 2 3 4 5 6],大小n=6和k=7在应该为真时返回false。 我似乎找不到那只虫子。谁能告诉我我在哪里犯了错吗?如果我没弄错的话,这会在O(n)时间内运行吗

public static boolean sum(int[]A,int n,int k)//其中k是所需的和,n是数组的大小
{
如果(k=A[n]*2)
{
返回false;
}
int i=0;
int j=n-1;
返回和递归(A,n,k,i,j);
}
私有静态布尔和_递归(int[]A,int n,int k,int i,int j)
{
如果(i==j)
{
返回false;
}else如果((A[i]+A[j])==k)
{
返回true;
}如果((A[i]+A[j])>k)
{
返回和递归(A,n,k,i,j-);
}
返回和递归(A,n,k,i++,j);
}
两个问题:

  • j-,将首先使用j,然后-。它应该是j-1或--j。i++也是如此

  • 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);
    }
    
    publicstaticvoidmain(字符串[]args){
    int[]a={1,2,3,4,5,6};
    System.out.println(和(a,6,7));//=>true
    }
    公共静态布尔和(int[]A,int n,int k)//其中k是所需的和,n是数组的大小
    {
    如果(k=A[n-1]*2){
    返回false;
    }
    int i=0;
    int j=n-1;
    返回和递归(A,n,k,i,j);
    }
    私有静态布尔和_递归(int[]A,int n,int k,int i,int j){
    如果(i==j){
    返回false;
    }else如果((A[i]+A[j])==k){
    返回true;
    }如果((A[i]+A[j])>k){
    返回和递归(A,n,k,i,j-1);
    }
    返回和递归(A,n,k,i+1,j);
    }
    
    两个问题:

  • j-,将首先使用j,然后-。它应该是j-1或--j。i++也是如此

  • 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);
    }
    
    publicstaticvoidmain(字符串[]args){
    int[]a={1,2,3,4,5,6};
    System.out.println(和(a,6,7));//=>true
    }
    公共静态布尔和(int[]A,int n,int k)//其中k是所需的和,n是数组的大小
    {
    如果(k=A[n-1]*2){
    返回false;
    }
    int i=0;
    int j=n-1;
    返回和递归(A,n,k,i,j);
    }
    私有静态布尔和_递归(int[]A,int n,int k,int i,int j){
    如果(i==j){
    返回false;
    }else如果((A[i]+A[j])==k){
    返回true;
    }如果((A[i]+A[j])>k){
    返回和递归(A,n,k,i,j-1);
    }
    返回和递归(A,n,k,i+1,j);
    }
    
    O(n)算法:

  • 将数组元素插入哈希表或哈希映射
  • 迭代数组并查看
    k-currentElement
    是否存在于哈希数据结构中
  • O(n)算法:

  • 将数组元素插入哈希表或哈希映射
  • 迭代数组并查看
    k-currentElement
    是否存在于哈希数据结构中

  • 这应该是O(n),显示问题的最小输入是多少?当您尝试在调试器中调试代码时,会看到什么?注意:
    sum\u递归
    不使用
    n
    。为什么
    j=n-1
    ?如果需要最后一个值怎么办?@PeterLawrey和任何输入,即我给它一个数组,然后用该数组中两个整数和其他k的总和k值测试它。。。在所有情况下,它都返回false。这从来都不是真的。n是数组的大小(它是作为一个参数给出的。因此我将j=n-1作为最后一个索引。如果
    n
    是数组的大小
    a[n]
    将始终引发异常。我建议您使用
    a.length
    作为数组的大小。注意:如果a[0]我不知道测试的输入是否只会是正的,所以我想为了安全起见,我会把那条线去掉。这应该是O(n),显示问题的最小输入是什么?当您尝试在调试器中调试代码时,您会看到什么?注意:
    sum\u递归
    不使用
    n
    。为什么
    j=n-1
    ?如果需要最后一个值呢?@PeterLawrey使用任何输入,即我给它一个数组,然后用k个值测试它,k个值是o的和f该数组中的两个整数以及其他k……在所有情况下,它都返回false。它永远不会为true。n是数组的大小(它作为一个参数给出。因此我将j=n-1作为最后一个索引。如果
    n
    是数组的大小
    a[n]
    将始终引发异常。我建议您使用
    A.length
    作为数组的大小。注意:如果A[0]是<0
    k我不知道测试的输入是否只有正值,所以我想出于安全考虑,我会把这一行去掉。注意:你的版本也会找到-1+2=1,OP的版本假设没有负值。+1谢谢。哦,这是有道理的,我应该意识到!:|我对n参数没有选择,我们是给定方法头,必须使用给定参数完成内部代码。我更改了关于I和j的代码,但不幸的是,它仍然返回false.:(@user156177更新了答案。将A[n]*2更改为A[n-1]*2.
    n
    不用于
    sum\u递归
    ,可以删除。
    n
    也可以在中替换为
    A.length