Given an array of integers, return a new array such that each element at index i of the new array is the product of all the numbers in the original array except the one at i.
For example, if our input was [1, 2, 3, 4, 5], the expected output would be [120, 60, 40, 30, 24]. If our input was [3, 2, 1], the expected output would be [2, 3, 6].
Pierwszym pomysłem jest obliczenie iloczynu całej tablicy (złożoność O(n)), a następnie dla każdego elementu tablicy, dzielimy iloczyn przez ten element i dodajemy do nowej tablicy. (złożoność O(n)) Ostatecznie nasza złożoność wynosi O(n).
Problem pojawia się, gdy dodatkowym wymogiem jest brak możliwości użycia dzielenia. Moją propozycją jest wykonanie dzielenia od ręki, to znaczy odejmować liczbę od iloczynu, dopóki nie uzyskamy zera. (w kodzie dzieleniem zajmuje się funkcja process)
Kod w Java:
static int process(int number, int product) {
int counter = 0;
while(product > 0) {
product = product - number;
counter++;
}
return counter;
}
public static void main(String[] args) {
int[] numbers = new int[]{1, 2, 3, 4, 5};
int[] results = new int[numbers.length];
int product = 1;
for(int x : numbers) {
product *= x;
}
for(int i = 0; i < numbers.length; i++) {
results[i] = process(numbers[i], product);
}
for(int i = 0; i < numbers.length; i++) {
System.out.println(results[i]);
}
}
}
Jaka jest złożoność obliczeniowa tego kodu?
Moja próba: pierwsza pętla to O(n), metoda process() to O(n), zatem druga pętla to O(n^2). Wizualizacje wyników pomijamy, ostateczna złożoność wynosi O(n^2).