题目:
一个整数数组 arr返回数组 answer
,其中 answer等于 中除 nums[i]
之外其余各元素的乘积 。
数据 保证 数组 arr
之中任意元素的全部前缀元素和后缀的乘积都在 32 位整数范围内。
时间复杂度O(n)。
分析:
对answer[ i ]的值,是由arr[0] ~ arr[i-1] ~ arr[i+1] ~ arr[length -1]相乘的结果
我们将整个数组从i处分开成两部分,设置两个数组,一个负责i左边所有数的乘积和,一个负责i右边所有数的乘积和,最后将这两部分数组的第i个元素相乘,结果放入answer[ i ]中即可
举例:
int arr[ ] = { 1, 2, 3, 4 }; length = 4;
i = 0 : left[0] = 1 ; rigth[0] = 1*2*3*4 = 24 left[0]*rigth[0] = 24
i = 1 : left[1] = 1*1 ; rigth[1] = 3*4 = 12 left[1]*rigth[1] = 12
i = 2 : left[2] = 1*2 = 2 ; rigth[2] = 4 left[2]*rigth[2] = 8
i = 3 : left[3] = 1*2*3 = 6; rigth[3] = 1 left[3]*rigth[3] = 6
实现代码:
#include<iostream>
using namespace std;
void productExceptSelf(int* arr, int n,int* answer)
{
int* left = new int[n];
int* right = new int[n];
//i元素左边数组乘积和
left[0] = 1;
for (int i = 1; i < n; i++)
{
left[i] = arr[i - 1] * left[i - 1];
}
//i元素右边数组乘积和
right[n - 1] = 1;
for (int i = n - 2; i >= 0; i--)
{
right[i] = arr[i + 1] * right[i + 1];
}
//合成最后结果
for (int i = 0; i < n; i++)
{
answer[i] = left[i] * right[i];
}
delete[] left;
delete[] right;
}
int main()
{
//int arr[] = { 1, 2, 3, 4 };
int arr[] = { -1,1,0,-3,3 };
int length = sizeof(arr) / sizeof(arr[0]);//计算数组长度
int* answer = new int[length];
productExceptSelf(arr, length,answer);
for (int i = 0; i < length; i++)
{
printf("%d ", answer[i]);
}
delete[] answer;
return 0;
}
运行结果:
int arr[] = { 1, 2, 3, 4 };
int arr[] = { -1,1,0,-3,3 };