Ваш код не O (n), потому что для каждого элемента массива v1
вы запускаете функцию .reduce()
, которая проходит через весь массив, поэтому это O (n ^ 2).
Вы можете сделать это, вычислив общий продукт, затем повторив один раз по массиву v1
и вставив total / current
в массив v2
. Таким образом, вы получите желаемый результат с O (n) сложностью.
const v1 = [4, 2, 7, 8, 6, 7, 9, 3, 2, 6, 7];
const v2 = [];
const productTotal = v1.reduce((res, curr) => res * curr);
v1.forEach((el) => v2.push(productTotal/el));
console.log(v2);
Итак, в целом вы повторяете дважды через массив v1
- один раз для вычисления productTotal
и один раз для вычисления v2
, поэтому в Фактически, это сложность O (2n), но мы можем игнорировать 2
, потому что это все еще O (n).
Чтобы добиться этого без деления, вы можете использовать трюк, и вместо использования деления напрямую, вы можете использовать умножение и мощность -1
(не знаю, считается ли это):
const v1 = [4, 2, 7, 8, 6, 7, 9, 3, 2, 6, 7];
const v2 = [];
const productTotal = v1.reduce((res, curr) => res * curr);
v1.forEach((el) => v2.push(productTotal*Math.pow(el, -1)));
console.log(v2);