除自身以外数组的乘积
1.题目链接:
238. 除自身以外数组的乘积
2.原题描述:
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请不要使用除法,且在 O(n) 时间复杂度内完成此题。
3.相关算法
本题考察数组相关知识点,看完题目感觉思路很简单,于是就咔咔敲代码两层for循环,执行代码结果正确,提交却超时了,看了一下数据量10^5,思考了半天没想出更好的办法,观看官方题解,给出的一种很巧妙的方法,分别对左右数组分别乘积,再将左右数组相乘,刚好满足了除自身之外的数组相乘。
4.本题主要思路
先分别创建左右数组,再创建结果数组,初始化左数组,将第一个元素赋值为1,初始化右数组,将最后一个元素赋值为1,在使用for循环将左右数组分别乘以nums数组的值,最后结果数组分别等于左右数组的相应下标值相乘。
5.源码分析
class Solution {
public int[] productExceptSelf(int[] nums) {
int length = nums.length; // 1
int[] l = new int[length]; // 2
int[] r = new int[length];
int[] result = new int[length]; // 3
l[0] = 1; // 4
r[length-1] = 1;
for(int i = 1;i<length;++i){ // 5
l[i] = nums[i-1]*l[i-1];
}
for(int i=length-2;i>=0;i--){ // 6
r[i] = nums[i+1]*r[i+1];
}
for(int i = 0;i<length;++i){ ` // 7
result[i] = l[i]*r[i];
}
return result; // 8
}
}
- 获取原数组的程度并创建变量,为后面创建数组和循环变量提供方便;
- 创建左右数组;
- 创建结果数组;
- 初始化左右数组;
- 将左数组的其他元素与nums数组相乘的到左乘积列表【从左往右】;
- 将右数组的其他元素与nums数组相乘的到右乘积列表【从右往左】;
- 将上面的到左右数组的乘积对应相乘的到结果数组;
- 返回结果数组。