C++实现除自身以外数组的乘积
在算法和数据结构领域中,有一类问题是求解一个数组中每个元素除了自身以外的所有元素之积。这种问题在实际的编程中经常遇到,例如计算一个数组中每个元素的百分比或概率等。本文将介绍一种时间复杂度为O(n)的算法来解决这个问题。
问题描述
给定一个整数数组nums,返回一个数组answer,其中answer[i]等于nums中除nums[i]之外其余各元素的乘积。例如,对于数组[1,2,3,4],答案应该是[24,12,8,6]。
要求不使用除法,并且保证数组nums中任意元素的全部前缀元素和后缀的乘积都在32位整数范围内。
算法思路
我们可以将每个元素的答案分解为它左边所有元素之积和它右边所有元素之积的乘积。具体来说,对于数组中的每个元素i,我们可以计算出它左边所有元素之积left[i]和右边所有元素之积right[i],然后将它们相乘即可得到答案。
为了计算left[i]和right[i],我们可以分别使用两个循环来遍历数组。第一个循环从左到右计算left[i],第二个循环从右到左计算right[i]。具体来说,对于left[i],我们可以使用一个变量来记录i左边所有元素之积,初始值为1,然后从左到右遍历数组,每次将当前元素乘以变量的值并更新变量即可。对于right[i],我们可以使用一个类似的变量来记录i右边所有元素之积。
最后,我们将left[i]和right[i]相乘即可得到答案。
算法实现
下面是C++代码实现:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int> left(n, 1);
vector<int> right(n, 1);
vector<int> ans(n);
for (int i = 1; i < n; i++) {
left[i] = left[i - 1] * nums[i - 1];
}
for (int i = n - 2; i >= 0; i--) {
right[i] = right[i + 1] * nums[i + 1];
}
for (int i = 0; i < n; i++) {
ans[i] = left[i] * right[i];
}
return ans;
}
时间复杂度分析
该算法需要三次遍历数组,因此时间复杂度为O(3n)=O(n),符合题目要求。
总结
本文介绍了一种时间复杂度为O(n)的算法来解决求解一个数组中每个元素除了自身以外的所有元素之积的问题。该算法使用两个循环分别计算每个元素左边和右边所有元素之积,并将它们相乘得到答案。该算法不使用除法,并且保证了算法的时间复杂度满足题目要求。