算法题:除了自身以外数组的乘积

📅 发布时间:2026/7/9 7:25:51 👁️ 浏览次数:
算法题:除了自身以外数组的乘积
题目描述思路分析我们可以通过构造两个辅助数组来解决这个问题pre数组和suf数组分别表示当前位置左边和右边元素的乘积。定义pre[i]表示从nums[0]到nums[i-1]的乘积。定义last[i]表示从nums[i1]到nums[n-1]的乘积。为了计算出每个位置i对应的结果answer[i]我们可以将左边的乘积pre[i]和右边的乘积last[i]相乘得到最终的答案answer[i]pre[i]⋅last[i]为了减少空间复杂度我们可以将pre和last合并成一个ans数组并通过两次遍历来填充它第一次遍历计算pre[i]。第二次遍历计算last[i]并直接更新ans[i]。算法步骤初始化pre[0] 1表示空子数组的乘积。last[n-1] 1表示空子数组的乘积。填充pre数组从左到右遍历数组计算每个位置左边的乘积。填充last数组并计算最终结果从右到左遍历数组同时计算右边的乘积并更新ans[i]。代码class Solution { public int[] productExceptSelf(int[] nums) { int n nums.length; // 用于存储左边的乘积 int[] pre new int[n]; pre[0] 1; // 左边为空数组的乘积为1 // 用于存储右边的乘积 int[] last new int[n]; last[n - 1] 1; // 右边为空数组的乘积为1 // 填充pre数组pre[i]表示从0到i-1的乘积 for (int i 1; i n; i) { pre[i] pre[i - 1] * nums[i - 1]; } // 填充last数组last[i]表示从i1到n-1的乘积 for (int i n - 2; i 0; i--) { last[i] last[i 1] * nums[i 1]; } // 用pre和last数组计算最终结果 int[] ans new int[n]; for (int i 0; i n; i) { ans[i] pre[i] * last[i]; } return ans; } }