Given an array of n (n
> 1) integers nums, return an array output such that output[i] is equal to the product of all the
elements of nums except nums[i].
Solve it in O(n) and costant space complexity.
For example, given
[1,2,3,4], return [24,12,8,6].
Задан массив из n (n
> 1) целых чисел nums. Вернуть массив, в котором output[i] равно произведению всех элементов из nums кроме nums[i].
Решите задачу за время O(n) и константную память.
Например, для массива
[1,2,3,4] следует вернуть [24,12,8,6].
// C++
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
}
};
// Java
public class
Solution {
public int[]
productExceptSelf(int[] nums) {
}
}
последовательности
Пусть prod – произведение всех
чисел. Тогда output[i] = prod
/ nums[i]. Однако такое решение не работает,
если массив nums изначально содержит нули.
Заведем два массива:
t1[i] будет содержать произведение префикса nums[0] * … * nums[i – 1];
t2[i] будет содержать произведение суффикса nums[i + 1] * … * nums[n – 1];
Положим t1[0] = t2[n – 1] = 1.
Тогда output[i] = t1[i] * t2[i].
Реализация алгоритма
class Solution
{
public:
vector<int> productExceptSelf(vector<int>& nums) //
[1,2,3,4]
{
int i, size = nums.size();
vector<int> t1(size), t2(size);
t1[0] = 1;
for(i = 0; i < size - 1; i++) // [1,1,2,6]
t1[i+1] = t1[i] *
nums[i];
t2[size-1] = 1;
for(i = size - 1; i > 0; i--) // [24,12,4,1]
t2[i-1] = t2[i] *
nums[i];
vector<int> res;
for(i = 0; i < size; i++) //
[24,12,8,6]
res.push_back(t1[i] * t2[i]);
return res;
}
};
Java реализация
class Solution
{
public int[]
productExceptSelf(int[] nums)
{
int size = nums.length;
int t1[] = new int[size];
int t2[] = new int[size];
t1[0] = 1;
for(int i = 0; i <
size - 1; i++) // [1,1,2,6]
t1[i+1] = t1[i] *
nums[i];
t2[size-1] = 1;
for(int i = size - 1;
i > 0; i--) // [24,12,4,1]
t2[i-1] = t2[i] *
nums[i];
int res[] = new int[size];
for(int i = 0; i <
size; i++) // [24,12,8,6]
res[i] = t1[i] *
t2[i];
return res;
}
}