Java 递归:确定数组A中是否有两个元素和k之和
我见过很多人问这个问题。我知道它是如何工作的:我们检查第一个和最后一个的总和。如果这个总和大于k,那么最后一个-,或者如果它小于k,那么第一个++。这将递归进行,直到找到first==last或求和k为止。 **请注意,数组中的值始终已按升序排序 我尝试过使用递归,但每当我运行它时,它总是返回“false”。我尝试过各种大小的数组,所有测试用例都返回false。e、 数组[1 2 3 4 5 6],大小n=6和k=7在应该为真时返回false。 我似乎找不到那只虫子。谁能告诉我我在哪里犯了错吗?如果我没弄错的话,这会在O(n)时间内运行吗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。 我似乎找不到那只虫子。谁能告诉我我在哪里犯了错吗?
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);
}
两个问题:
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);
}
两个问题:
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
是否存在于哈希数据结构中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]是<0k我不知道测试的输入是否只有正值,所以我想出于安全考虑,我会把这一行去掉。注意:你的版本也会找到-1+2=1,OP的版本假设没有负值。+1谢谢。哦,这是有道理的,我应该意识到!:|我对n参数没有选择,我们是给定方法头,必须使用给定参数完成内部代码。我更改了关于I和j的代码,但不幸的是,它仍然返回false.:(@user156177更新了答案。将A[n]*2更改为A[n-1]*2.n
不用于sum\u递归
,可以删除。n
也可以在中替换为A.length