Leetcode 238 除自身以外数组的乘积
除自身以外数组的乘积(Product of Array Except Self)
给你一个长度为 n 的整数数组 nums
,其中 n > 1,返回输出数组 output
,其中 output[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积。
示例:
输入: [1,2,3,4]
输出: [24,12,8,6]
提示: 题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。
说明: 请 不要使用除法,且在 O(n) 时间复杂度内完成此题。
进阶: 你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* productExceptSelf(int* nums, int numsSize, int* returnSize){
*returnSize = numsSize;
int * result = malloc(sizeof(int)*numsSize);
for (int i =0;i<numsSize;i++){
int left = 1;
for(int j =0;j<=i-1;j++){
left *= nums[j];
}
int right =1;
for (int j =i+1;j<numsSize;j++){
right *=nums[j];
}
result[i] = left*right;
}
return result;
}
int* productExceptSelf(int* nums, int numsSize, int* returnSize){
int *result = malloc(sizeof(int)*numsSize);
int *lefts = malloc(sizeof(int)*numsSize);
lefts[0]=1;
for(int i =1;i<numsSize;i++){
lefts[i] = lefts[i-1]*nums[i-1];
}
int *rights = malloc(sizeof(int)*numsSize);
rights[numsSize-1]=1;
for(int i =numsSize-2;i>=0;i--){
rights[i] = rights[i+1]*nums[i+1];
}
// 这个for可以放在上面,right[i] 算完了就可以算result[i]了,然后少一个for循环
for (int i =0;i<numsSize;i++){
result[i] = lefts[i]*rights[i];
}
*returnSize = numsSize;
return result;
}
题目问能不能不要额外的空间,然后返回的空间不算,因此我们先第一步简化
int left = 1;
for (int i =0;i<numsSize;i++){
result[i] = left * right[i];
left = left *nums[i];
}
这样就去掉了lefts数组
我们还可以用result去存原来rights存的内容,最终结果为
int* productExceptSelf(int* nums, int numsSize, int* returnSize){
*returnSize = numsSize;
int *result = malloc(sizeof(int)*numsSize);
result[numsSize-1] = 1;
for(int i =numsSize-2;i>=0;i--){
result[i] = result[i+1]*nums[i+1];
}
int left = 1;
// 这里的每个result[i] 在使用后都不需要再使用,因此可以直接被结果覆盖
for (int i =0;i<numsSize;i++){
result[i] = left * result[i];
left = left *nums[i];
}
return result;
}
这样就达到了题目的所有要求