技术交流可以加:
本人微信:xcg852390212
本人qq:852390212
学习交流qq群1(已满): 962535112
学习交流qq群2: 780902027
除自身以外数组的乘积
给定长度为 n
的整数数组 nums
,其中 n > 1
,返回输出数组 output
,其中 output[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积。
示例:
输入: [1,2,3,4]
输出: [24,12,8,6]
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
进阶:
你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)
解答
方法1
由于output[i] = nums[0]*nums[1]*...*nums[i-1]*nums[i+1]*...*nums[len-1]
,可以将output[i]
分为两部分,前半部分为C[i] = nums[0]*nums[1]*...*nums[i-1]
,后半部分为D[i] = nums[i+1]*...*nums[len-1]
。可以发现规律,数组C和D相邻元素之间存在递推关系:
C[i] = C[i-1]*nums[i-1] (i = 1~len-1)
D[i] = D[i+1]*nums[i+1] (i = 0~len-2)
因此求出数组output
的每一项output[i] = C[i]*D[i]
。
- 时间复杂度:O(n)
- 空间复杂度:O(n)
C++代码
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int len = nums.size();
if(len == 0) return nums;
vector<int> res(len,1);
vector<int> C(len,1);
vector<int> D(len,1);
for(int i=1;i<len;i++)
{
C[i] = nums[i-1]*C[i-1];
}
for(int i=len-2;i>=0;i--)
{
D[i] = D[i+1]*nums[i+1];
}
for(int i=0;i<len;i++)
{
res[i] = C[i]*D[i];
}
return res;
}
};
Python代码
class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
n = len(nums)
nums_l,nums_r = [1 for x in range(n)],[1 for x in range(n)]
res = []
for i in range(1,n):
nums_l[i] = nums_l[i-1] * nums[i-1]
for i in range(n - 2,-1,-1):
nums_r[i] = nums_r[i + 1] * nums[i + 1]
for i in range(n):
res.append(nums_l[i] * nums_r[i])
return res
方法2:优化空间复杂度
先将数组C的数值计算到输出数组res
中,然后定义一个变量tmp
代替数组D的递推关系计算,对数组res
从后向前进行递推计算得出最终结果。可以优化空间复杂度到常数时间。
- 时间复杂度:O(n) (输出数组不被视为额外空间)
- 空间复杂度:O(1)
C++代码
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int len = nums.size();
if(len == 0) return nums;
vector<int> res(len,1);
for(int i=1;i<len;i++)
{
res[i] = res[i-1] * nums[i-1];
}
int tmp = 1;
for(int i=len-2;i>=0;i--)
{
tmp *= nums[i+1];
res[i] *= tmp;
}
return res;
}
};
Python代码
class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
n = len(nums)
res = [1 for x in range(n)]
for i in range(1,n):
res[i] = nums[i-1] * res[i-1]
tmp = 1
for i in range(n - 1,-1,-1):
res[i] *= tmp
tmp *= nums[i]
return res