我写它是为了一次处理一个测试用例。 在线评委花费的时间太长或返回错误的答案
来源:我用来测试它的问题
它非常适合小箱子:
#include <iostream>
#include <algorithm>
#include <vector>
int LIS[100000];
void LS (int *arr , int n)
{
if (n == 0)
{
LIS[0] = 1;
return;
}
if (LIS[n])
{
return;
}
int i = 0;
int max = 0;
while (i < n)
{
if (arr[i] < arr[n])
{
LS(arr,i);
if (LIS[i] + 1 > max)
{
max = 1 + LIS[i];
}
}
++i;
}
LIS[n] = max;
}
int main()
{
int n;
std::cin >> n;
int arr[n];
for(int i = 0 ; i < n ; ++i) std::cin >> arr[i];
LS(arr,n-1);
std::sort (LIS , LIS+n);
std::cout << "n" << LIS[n-1] << "n";
}
你说它适用于完美的小情况......而不是可能是堆栈溢出..
函数调用消耗堆栈内存。
如果递归调用深度太深,堆栈内存耗尽并崩溃。
当你从std::cin
读取int n
值时,你必须为数组arr
动态分配内存,所以你应该首先声明int *arr
,然后以与现在相同的方式获取用户输入,然后使用arr = new int[n]
分配内存。
当谈到使用递归函数计算下一个值所需的时间时,您应该考虑将函数重新制作为使用尾递归,这更接近迭代。您可以通过编写两个程序来计算斐波那契数 - 一个递归和另一个迭代,然后检查使用这两种方法计算~50个值需要多长时间。