LeetCode16 - 除了自身以外数组的乘积
📝 题目描述
题目链接:除了自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除了 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32位整数 范围内。
请 不要使用除法,且在 时间复杂度内完成此题。
示例:
1 |
|
提示:
2 <= nums.length <= 10^5-30 <= nums[i] <= 30输入 保证 数组 answer[i] 在 32 位 整数范围内
💡 解题思路
方法一:左右乘积列表
最容易想到的方法,首先构建两个数组 prefix 和 suffix。
其中 prefix[i] 代表 输入数组中 nums[i] 前面所有数字的乘积(不含nums[i]自己);同理,suffix[i] 代表 输入数组中 nums[i] 后面所有数字的乘积(不含nums[i]自己)。
值得注意的是,由于 nums[0]前面没有元素,prefix[0] 要置 1;同理,nums[n - 1]后面没有元素,suffix[0] 要置 1。
这样一来,答案数组 answer[i] 就等于 prefix[i] * suffix[i]。
方法二:优化解法
这里可以优化的地方是空间复杂度方面,可以用一个临时变量记录前缀积,然后将 suffix 数组藏进 answer中,节省空间复杂度到 。
🔧 代码实现
1、左右乘积列表
1 | class Solution { |
2、优化解法
1 | class Solution { |
📊 复杂度分析
1、左右乘积列表
- 时间复杂度:,其中 指的是数组
nums的大小。预处理prefix和suffix数组以及最后的遍历计算都是 的时间复杂度。 - 空间复杂度:,其中 指的是数组
nums的大小。使用了prefix和suffix数组去构造答案,prefix和suffix数组的长度为数组 nums 的大小。
2、优化解法
- 时间复杂度:,其中 N 指的是数组
nums的大小。分析与方法一相同。 - 空间复杂度:,输出数组不算进空间复杂度中,因此我们只需要常数的空间存放变量。
🎯 总结
- 核心思想:稍微记一下优化解法。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 很多时候不懂事!