算法记录
LeetCode 题目:
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据保证数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位整数范围内。
请不要使用除法,且在 O(n) 时间复杂度内完成此题。
说明
一、题目
输入: nums = [1,2,3,4]
输出: [24,12,8,6]
二、分析
- 如果说这个题不限制使用除法的话直接计算整个数组的乘积,然后除以当前索引的值就可以拿到其余数据的乘积了,但是这一条路直接被抛弃了。
- 我们不妨来看一下除了当前节点的其余元素乘积之和,是不是就是当前点直接的元素乘积和当前点之后元素乘积的积呢?这样一看当前点之前这不就是前缀和的使用方式么。
- 所以创建一个前缀积和后缀积就可以解决问题了,给出的元素个数大于 2 个,因此不存在复杂的边界问题。
class Solution {
public int[] productExceptSelf(int[] nums) {
int len = nums.length;
int[] pre = new int[len], last = new int[len], ret = new int[len];
pre[0] = nums[0];
last[len - 1] = nums[len - 1];
for(int i = 1; i < len; i++) {
pre[i] = pre[i - 1] * nums[i];
}
for(int i = len - 2; i >= 0; i--) {
last[i] = last[i + 1] * nums[i];
}
ret[0] = last[1];
ret[len - 1] = pre[len - 2];
for(int i = 1; i < len - 1; i++) {
ret[i] = pre[ i - 1] * last[i + 1];
}
return ret;
}
}
总结
前缀和的变种前缀积的使用。