整体思路:
结果集中任何一个元素 = 其左边所有元素的乘积 * 其右边所有元素的乘积。一轮循环构建左边的乘积并保存在结果集中,二轮循环 构建右边乘积的过程,乘以左边的乘积,并将最终结果保存
class Solution {
public:
vector<int> constructArr(vector<int>& a) {
int len = a.size();
if (len == 0) return {}; // 判空
// 初始化乘积数组,初始时每个元素都是1,方便后续相乘
vector<int> b(len, 1);
/*
* 先遍历表格下三角部分
* 为防止数组越界,从 1 开始递增遍历
*/
for (int i = 1; i < len; i++) {
b[i] = b[i - 1] * a[i - 1];
}
int temp = 1; // 辅助变量
/*
* 再遍历表格上三角部分
* 为防止数组越界,所以从 len-2 开始递减遍历
*/
for (int i = len - 2; i >= 0; i--) {
temp *= a[i + 1];
b[i] *= temp;
}
return b;
}
};