Различное поведение с одинаковой сложностью

Я решаю следующий вопрос о LeetCode:

Напишите функцию, которая принимает целое число n и возвращает все возможные комбинации ее факторов. Например, 12 должен вернуть:
[
   [2, 6],
   [2, 2, 3],
   [3, 4] ]

Я придумал следующий подход (в C ++):

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();
}
}
}
};

Это работает, как и ожидалось, но время ожидания последнего тестового случая: 23848713,

Одно из принятых и одобренных решений (на Java) следующее:

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);
}
}
}

Временные сложности обоих кодов одинаковы (на мой взгляд). Почему тогда мой код ошибка и другой код успешно запущен 23848713? Я имею в виду, есть ли какая-то явная ошибка в моем коде, или это какая-то проблема с онлайн-судьей?

Я ценю вашу помощь.

редактировать: Не было <=n в моем for loop condition в коде ранее (только потому, что он есть в другом коде — он на самом деле не нужен в соответствии с вопросом). Я включил это позже. Но в любом случае, это все еще истекло.

Edit2: В нотации big-O мы пропускаем коэффициенты n, Я думаю, что это причина, по которой он ломается здесь. Мой код имеет большие значения этих констант. Я не могу придумать других объяснений.

-2

Решение

Из-за первого цикла (в котором я рассчитываю произведение всех чисел в factors в each), мой код был выше, чем величина O(n), Из-за этого не получилось.

Тем не менее, когда я назвал это со значением n/i (и не n), Я мог бы полностью избавиться от фактора O (n), исключив весь цикл. Это так, потому что мне больше не нужно было проверять, был ли продукт равен n,

Таким образом, код, наконец, был принят из-за этого изменения. Благодарю.

(Размещение, как это может быть полезно для кого-то). Кроме того, благодаря @user4581301 за подсказку, которая в итоге привела меня к этому.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]