问题描述:
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].
结题思路:存储一个left和right数组,当求元素i时,只需让left[i]*right[i]即可,题目中要求不让使用除法,事实上使用除法时还会引发除0错误等问题,更麻烦。
代码如下:40ms
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
int* res = (int *)malloc(sizeof(int)*numsSize);
int* left = (int *)malloc(sizeof(int)*numsSize);//store the product of left of element i
int* right = (int *)malloc(sizeof(int)*numsSize);//store the product of right of element i;
int i;
left[0] = 1;
for(i = 1;i<numsSize;i++)
left[i] = nums[i-1]*left[i-1];
right[numsSize-1] = 1;
for(i = numsSize-2;i>=0;i--)
right[i] = nums[i+1]*right[i+1];
for(i = 0;i<numsSize;i++)
res[i] = left[i]*right[i];
*returnSize = numsSize;
return res;
}
代码2:题目中问能否用常数空间复杂度完成工作。无法是将left和right的信息保存在res中,
修改代码如下:40ms
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
int* res = (int *)malloc(sizeof(int)*numsSize);
int i;
res[0] = 1;
for(i = 1;i<numsSize;i++)
res[i] = res[i-1]*nums[i-1];
//now, we can focus on the right side
int rightCount = 1;
for(i = numsSize-1;i>=0;i--){
res[i] = res[i]*rightCount;
rightCount = rightCount * nums[i];
}
*returnSize = numsSize;
return res;
}