diff --git a/普通数组/4. 除自身以外数组的乘积.md b/普通数组/4. 除自身以外数组的乘积.md new file mode 100644 index 0000000..1f64d64 --- /dev/null +++ b/普通数组/4. 除自身以外数组的乘积.md @@ -0,0 +1,67 @@ +# 除自身以外数组的乘积 + +## 题目 + +给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 + +题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 + +请 不要使用除法,且在 O(n) 时间复杂度内完成此题。 + + + +示例 1: + +输入: nums = [1,2,3,4] +输出: [24,12,8,6] +示例 2: + +输入: nums = [-1,1,0,-3,3] +输出: [0,0,9,0,0] + + +提示: + +2 <= nums.length <= 105 +-30 <= nums[i] <= 30 +输入 保证 数组 answer[i] 在 32 位 整数范围内 + + +进阶:你可以在 O(1) 的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组 不被视为 额外空间。) + +## 思路 + +- 前缀乘积 +- 后缀乘积 +- 前缀乘积 * 后缀乘积 + +## 代码 + +```java +class Solution { + public int[] productExceptSelf(int[] nums) { + // Init: prefix, suffix + int len = nums.length; + int[] prefix = new int[len + 1]; + int[] suffix = new int[len + 1]; + prefix[0] = 1; + suffix[len] = 1; + + int[] ans = new int[len]; + // Traverse: prefix + for (int i = 0; i < len; i++) { + prefix[i + 1] = prefix[i] * nums[i]; + } + // Traverse: suffix + for (int i = len - 1; i >= 0; i--) { + suffix[i] = suffix[i + 1] * nums[i]; + } + // Calc. + for (int i = 0; i < len; i++) { + ans[i] = prefix[i] * suffix[i + 1]; + } + + return ans; + } +} +``` \ No newline at end of file