题目描述
给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
示例:
输入: [1, 2, 3, 4]
输出: [24, 12, 8, 6]
提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
题目链接:https://leetcode-cn.com/problems/product-of-array-except-self
解题思路
一、暴力求解
最简单的思路,对于每个元素都进行一次 for 循环,对非当前元素累计求积保存,时间复杂度是 O(N2),题目要求时间复杂度 O(N),所以这个思路排除。
二、利用除法
先用一次 for 循环把所有的数的乘积(product)算出来,再用一个 for 循环把(product/当前元素)保存起来。时间复杂度是 O(2N),题目要求不能使用除法,所以这个思路排除。
三、前后缀乘积表
先用 for 循环把每个元素之前所有元素的乘积(前缀乘积表 prefix)和之后所有元素的乘积(后缀乘积表 suffix)分别保存起来,再用一个 for 循环把(prefix[i] * suffix[i])结果保存起来。时间复杂度是 O(2N)。
public int[] productExceptSelf(int[] nums) {
int[] prefix = new int[nums.length];
int[] suffix = new int[nums.length];
prefix[0] = 1;
suffix[nums.length - 1] = 1;
for (int i = 1; i < nums.length; i++) {
prefix[i] = prefix[i - 1] * nums[i - 1];
suffix[nums.length - 1 - i] = suffix[nums.length - i] * nums[nums.length - i];
}
int[] res = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
res[i] = prefix[i] * suffix[i];
}
return res;
}
视频讲解
- 在 YouTube 上查看请点击https://youtu.be/gqhO3YejwK8
- 在 B 站上查看请点击https://bilibili.com/video/BV1HZ4y1W7W6
- 在西瓜视频上查看请点击https://www.ixigua.com/i6835617103198814734