我正在解决楼梯问题并提出了多种解决方案。它看起来如下:
问题:您将获得N楼梯的数量。您可以采取的最大步骤是什么? 对于N = 5,您可以进行的最大步骤是2,因为
5 = 1 + 2 + 2
类似于8,其中,8 = 1 + 2 + 3 + 2,最大步长为3
类似地,对于16,其16 = 1 + 2 + 3 + 4 + 5 + 1,最大步长为5
当下一个数字小于之前的数字时,系列将停止
显然,最大步骤是系列中的最大数量。
解决方案1:
我提出了一个简单的解决方案。它工作正常,但没有优化。 以下是以下代码:
public static long stairCase(long N) {
long i = 1;
long curr = N;
while (i < N) {
curr = curr - i;
if (i >= curr) {
return i;
}
i = i + 1;
}
return i;
}
解决方案2:
然后我发现它的n(n + 1)/ 2.所以,如果我把n(n + 1)/ 2 =否。的 楼梯。我无法通过计算其根源和服用来获得解决方案 最高的根。我的代码如下所示,但它不起作用 对于N = 16和许多其他情况。
int b = 1;
int var = (1) - (4 * -c);
double temp1 = Math.sqrt(var);
double root1 = (-b + temp1) / (2 * a);
double root2 = (-b - temp1) / (2 * a);
double root1Abs = Math.abs(root1);
double root2Abs = Math.abs(root2);
return (long) (root1Abs > root2Abs ? Math.floor(root1Abs) : Math
.floor(root2Abs));
解决方案3:
我提出了另一个解决方案,但仍然不适用于N = 4 和许多其他情况。以下是我的代码:
double answer = Math.sqrt(c * 2);
return (long) (Math.floor(answer));
是否有人拥有优化的解决方案(最好是在恒定时间内),因为输入太大(长)。
答案 0 :(得分:1)
m =楼梯数
n =结果
等式是
a <- sample(c("A", "B", "C", "D", NA), 20, replace = T)
recode(a, old = c("A", NA), new = c("E", "F"))
解决方案是
n * (n+1) < 2m
我们尝试找到最大整数
n < (sqrt(8*m+1)-1)/2
Java代码:
n = floor((sqrt(8*m+1)-1)/2)
答案 1 :(得分:0)
其实我自己想出解决方案..我应该使用2 * c
int a = 1;
int b = 1;
int var = (1) - (4 * -2 * c);
double temp1 = Math.sqrt(var);
double root1 = (-b + temp1) / (2 * a);
double root2 = (-b - temp1) / (2 * a);
return (long) (root1 > root2 ? Math.floor(root1) : Math.floor(root2));