题目信息
给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
示例:
输入: [1,2,3,4]
输出: [24,12,8,6]
提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
解题思路
- 暴力破解:所有数字相乘,
ans[i] = multiply / nums[i]
- 无效操作分析:
- 规定不能使用除法
- 优化方法:
- 从题目出发,计算乘法可分解为需要得到
i - 1
与i + 1
处的值,相乘就可以得到结果 - 输出数组不被考虑在空间复杂度中,尽可能利用其缓存中间计算结果,减少循环嵌套
- 从题目出发,计算乘法可分解为需要得到
- 考虑边界
- 编码实现
代码
class Solution {
public int[] productExceptSelf(int[] nums) {
if (nums == null || nums.length == 0) {
return new int[0];
}
// 将原数组分为三段:[0..i) [i] (i+1..n]
// 定义输出数组
int length = nums.length;
int[] ans = new int[length];
// 预处理,此时从左到右表示左侧到当前位置的乘积值
ans[0] = 1;
for (int i = 1; i < length; i++) {
ans[i] = ans[i - 1] * nums[i - 1];
}
// 计算右侧的乘积值并乘上左侧的预处理值即可得到结果
int R = 1;
for (int i = length - 1; i >= 0; i--) {
ans[i] = ans[i] * R;
R *= nums[i];
}
return ans;
}
}
题目来源:力扣(LeetCode)
题目链接:https://leetcode-cn.com/problems/product-of-array-except-self
商业转载请联系官方授权,非商业转载请注明出处。