题目分析:[[EVD]] - 剑指 Offer 66. 构建乘积数组
https://leetcode-cn.com/problems/gou-jian-cheng-ji-shu-zu-lcof/
简单描述:
- 给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。
限制🚫
- 所有元素乘积之和不会溢出 32 位整数
- a.length <= 100000
- 不能使用除法
示例:
输入: [1,2,3,4,5]
输出: [120,60,40,30,24]
解题思路:
思路:
- #动态规划DP 计算上三角和下三角值
效率:
- 时间复杂度
- 空间复杂度
代码:
class Solution
{
public:
vector<int> constructArr(vector<int> &a)
{
int len = a.size();
if (len == 0)
return {};
vector<int> dp(len, 1);
dp[0] = 1;
//下三角dp计算
for (int i = 1; i < len; i++)
dp[i] = dp[i - 1] * a[i - 1]; // i从1开始遍历
//上三角dp计算
int tmp = 1;
for (int i = len - 1 - 1; i >= 0; i--) //i从len-2开始遍历
{
tmp *= a[i + 1];
dp[i] *= tmp;
}
return dp;
}
};