給定一個有n個數字的數組nums,其中n大於1,返回一個數組使得output[i]等於除nums[i]外所有元素的乘積。
不用分治並且在O(n)復雜度下解決這個問題。
例如,給定[1, 2, 3, 4],返回[24, 12, 8, 6]。
跟進:
你可以只在常量空間下完成它嗎?
(備注:在空間復雜度計算時輸出數組不作為額外空間。)
Given an array of n integers where n > 1, 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 without division and in O(n).
For example, given [1,2,3,4], return [24,12,8,6].
Follow up:
Could you solve it with constant space complexity? (Note: The output array does not count as extra space for the purpose of space complexity analysis.)
其實之前做過一道類似的題目,不過想不起來是哪題了。
看到題目的常量空間就想到和之前的一樣,把所有元素的乘積保存起來,最後再一個一個除就好了不是嗎?
然而有問題……
如果數組中有一個零叻?
假設其索引是index,那麼output[index]就是其余所有元素的乘積,也就是不計算0的乘積。
output數組的其余所有元素都是0。
如果數組中有兩個及以上零叻?
什麼都不用說,直接初始化為0吧。
如果數組中沒有0叻?
那還不謝天謝地了,直接一個一個除了保存到vector嘛。
class Solution {
public:
vector productExceptSelf(vector& nums) {
int count = 0;
int pro = 1;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] == 0) count++;
else pro *= nums[i];
}
if (count == 1) {
vector res;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] == 0) res.push_back(pro);
else res.push_back(0);
}
return res;
}
else if (count >= 2) {
vector res(nums.size());
return res;
}
else {
vector res;
for (int i = 0; i < nums.size(); i++)
res.push_back(pro / nums[i]);
return res;
}
}
};