C++ 具有相同时间复杂性的不同行为
我正在解决以下问题: 编写一个接受整数n并返回其因子的所有可能组合的函数。例如,C++ 具有相同时间复杂性的不同行为,c++,recursion,backtracking,recursive-backtracking,C++,Recursion,Backtracking,Recursive Backtracking,我正在解决以下问题: 编写一个接受整数n并返回其因子的所有可能组合的函数。例如,12应返回: [ [2,6], [2,2,3], [3,4] ] 我提出了以下方法(在C++中): 这两种代码的时间复杂度是相同的(在我看来)。那么,为什么我的代码失败,而另一个代码在23848713上成功运行?我的意思是,我的代码中是否有一些明显的错误,或者是在线法官的问题 我感谢你的帮助 编辑:由于第一个循环(我将因子中的所有数字的乘积计算成每个),所以没有,我的代码高于O(n)。因此,它失败了 然而,当我用值n
12
应返回:[
[2,6],
[2,2,3],
[3,4]
]
我提出了以下方法(在C++中): 这两种代码的时间复杂度是相同的(在我看来)。那么,为什么我的代码失败,而另一个代码在
23848713
上成功运行?我的意思是,我的代码中是否有一些明显的错误,或者是在线法官的问题
我感谢你的帮助
编辑:由于第一个循环(我将因子
中的所有数字的乘积计算成每个
),所以没有,我的代码高于O(n)
。因此,它失败了
然而,当我用值n/I
(而不是n
)调用它时,我可以通过消除整个循环来完全消除O(n)因子。这是因为我不再需要检查产品是否等于n
因此,由于这一变化,代码最终被接受。谢谢
(发布,因为它可能对某人有所帮助)。另外,感谢@user4581301
的提示,最终我找到了它。为什么要投否决票?想解释一下吗?!对不起,“这是我的代码,请找出问题所在”这样的问题在StackOverflow上是离题的。据我所知,OP的问题在这个网站上是完全有效的。话虽如此,它可能被否决的一个原因是,定期使用调试器可能会解决这类问题,这通常是问题被否决的一个原因。此外,OP用C++
和Java
标记了他们的问题,这是一个很大的禁忌,除非你的问题涉及到这两种语言之间的互操作(这肯定不是)。@Xirema,谢谢。它触及灰色区域。但问题就是这样!此外,我还附有C++和java,因为代码是在这些语言中。我可以继续删除Java,我必须回到第二部分:绘制非常相似的时间曲线。你对被丢弃的系数的怀疑看起来更接近正确。当我运行测试代码时,我使用容易被整除的数字运行测试代码,这种相似性非常突出,但也会耗尽RAM。第三个想法是,我们真正想要的是计算大O时的最坏情况。最好的情况也是类似的。最糟糕的情况是我没有策划。
class Solution {
public:
vector<vector<int>> getFactors(int n) {
if(n==0 || n==1) return vector<vector<int>>();
vector<vector<int>> result;
vector<int> factors;
getFactorsUtil(result, factors, n, 2);
return result;
}
void getFactorsUtil(vector<vector<int>>& result, vector<int>& factors, int n, int start) {
long int each=1;
for(int i=0; i<factors.size(); i++)
each = each*factors[i];
if(each==n) result.push_back(factors);
if(each>n) return;
for(int i=start; i<=n; i++) {
if(n%i==0) { //perfectly divisible
factors.push_back(i);
getFactorsUtil(result, factors, n, i);
factors.pop_back();
}
}
}
};
public List<List<Integer>> getFactors(int n) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
helper(result, new ArrayList<Integer>(), n, 2);
return result;
}
public void helper(List<List<Integer>> result, List<Integer> item, int n, int start){
if (n <= 1) {
if (item.size() > 1) {
result.add(new ArrayList<Integer>(item));
}
return;
}
for (int i = start; i <= n; ++i) {
if (n % i == 0) {
item.add(i);
helper(result, item, n/i, i);
item.remove(item.size()-1);
}
}
}