题目描述
给你一个整数数组 nums
,返回 数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积 。
题目数据 保证 数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32
位 整数范围内。
请 不要使用除法,且在 O(n)
时间复杂度内完成此题。
示例 1:
输入: nums = [1,2,3,4]
输出: [24,12,8,6]
示例 2:
输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]
提示:
2 <= nums.length <= 10^5
-30 <= nums[i] <= 30
保证 数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32
位 整数范围内。
题解
解题思路
左右乘积表,分别计算i
左侧和右侧乘积。
代码
c
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
// Function to compute the product of all elements in the input array except the current element
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
// Arrays to store the product of elements to the left and right of each element
int leftProduct[numsSize];
int rightProduct[numsSize];
// Calculate the product of elements to the left of each element
leftProduct[0] = 1;
for (int i = 1; i < numsSize; i++) {
leftProduct[i] = leftProduct[i - 1] * nums[i - 1];
}
// Calculate the product of elements to the right of each element
rightProduct[numsSize - 1] = 1;
for (int j = numsSize - 2; j >= 0; j--) {
rightProduct[j] = rightProduct[j + 1] * nums[j + 1];
}
// Set the return size for the caller
*returnSize = numsSize;
// Compute the final product array by multiplying left and right products
int* Answer = (int*)malloc(sizeof(int) * numsSize);
for (int k = 0; k < numsSize; k++) {
Answer[k] = leftProduct[k] * rightProduct[k];
}
return Answer;
}