思路
给定一个整数数组a,返回一个整数数组b
b中元素 对应a中 除了该元素 之外 其他元素的乘积
例如a =[1,2,3,4]
则 b=[2*3*4,1*3*4,1*2*4,1*2*3]
想办法 分别获取到 a中当前下标元素 左边元素的乘积 存入一个数组left
右边元素的乘积 存入一个数组right
需要注意的时 a[0] 左边没有元素 则a[0]左边元素的乘积 为1
a[3] 右边没有元素 则a[3]右边元素的乘积 为1
left = [1,1,1*2,1*2*3] right = [2*3*4,3*4,4,1]
结果数组res[i] = left[i]*right[i]
解法
class Solution {
public int[] productExceptSelf(int[] nums) {
//数组left,right 分别记录 当前元素 左边,右边元素 的乘积
int[] left = new int[nums.length];
int[] right = new int[nums.length];
int[] res = new int[nums.length];
//nums第0个元素 左边没有元素 所以左边元素的乘积为1
//nums第3个元素 右边没有元素 所以右边元素的乘积为1
int k = 1;
for (int i = 0; i < nums.length; i++) {
left[i] = k;
//k每次拿到nums中当前下标的元素
/**nums[4] = {2,4,6,8}
* left[0] = 1 k = 1*2
* left[1] = 2 k = 1*2*4
* left[2] = 8 k= 1*2*4*6
* left[3] = 48 k = 1*2*4*6*8
*/
k *= nums[i];
}
k = 1;
for (int i = nums.length - 1; i >= 0; i--) {
right[i] = k;
/**nums[4] = {2,4,6,8}
* right[3] = 1 k = 1*8
* right[2] = 8 k = 1*8*6
* right[1] = 48 k= 1*8*6*4
* right[0] = 192 k = 1*8*6*4*2
*/
k *= nums[i];
}
for (int i = 0; i < nums.length; i++) {
res[i] = left[i]*right[i];
}
return res;
}
}