leetcode238.除自身以外数组的乘积
题目描述
给你一个整数数组 nums
,返回 数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积 。
题目数据 保证 数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请 不要使用除法,且在 O(n)
时间复杂度内完成此题。
题目解法
解决方案使用了两个循环:
- 第一个循环(从左到右):计算每个元素左侧所有元素的乘积,并存储在输出数组 ans 中。
- 初始化 ans[0] 为 1,因为第一个元素左侧没有元素。
- 对于 i 从 1 到 n-1,ans[i] = ans[i-1] * nums[i-1]。这意味着 ans[i] 存储了索引 i 左侧所有元素的乘积。
- 第二个循环(从右到左):计算每个元素右侧所有元素的乘积,并将其与左侧乘积相乘,得到最终结果。
- 初始化一个变量 r 为 1,用于累积右侧元素的乘积。
- 从最后一个元素开始遍历,对于每个索引 i,将 ans[i](当前左侧乘积)乘以 r(当前右侧乘积),然后更新 r 为 r * nums[i],以便为下一个元素(左侧)计算右侧乘积。这样,对于每个元素 i,ans[i] 最终等于左侧乘积乘以右侧乘积,即除自身外所有元素的乘积。
class Solution {public int[] productExceptSelf(int[] nums) {int n = nums.length;int[] ans = new int[n];ans[0] = 1;// ans[i] 表示索引 i 左侧所有元素的乘积for(int i = 1; i < n; i++) {ans[i] = ans[i - 1] * nums[i - 1];}// r 为右侧所有元素的乘积int r = 1;for (int i = n - 1; i >= 0; i--) {ans[i] = ans[i] * r;r *= nums[i];}return ans;}
}