我已经看到这个问题了很多。我知道它是如何工作的:我们检查第一个和最后一个的总和。如果这个总和大于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);
}
答案 0 :(得分:3)
两个问题:
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);
}
答案 1 :(得分:0)
O(n)算法:
k - currentElement