题目链接:
题目描述:
思路:
i
i
i位置的乘积不包含
n
u
m
s
[
i
]
nums[i]
nums[i],只要得到
i
i
i左边所有元素的乘积
L
(
i
)
L(i)
L(i)和
i
i
i右边所有元素的乘积
R
(
i
)
R(i)
R(i),就能得到答案:
a
n
s
(
i
)
=
L
(
i
)
∗
R
(
i
)
ans(i) = L(i)*R(i)
ans(i)=L(i)∗R(i)
边界上:
L
(
0
)
=
1
L(0)=1
L(0)=1,
R
(
n
−
1
)
=
1
R(n-1)=1
R(n−1)=1
为了减少空间,可以直接使用
L
(
i
)
L(i)
L(i)放ans
L
(
i
)
=
L
(
i
)
∗
R
(
i
)
L(i) = L(i)*R(i)
L(i)=L(i)∗R(i)
这需要先得到
L
(
i
)
L(i)
L(i),然后计算结果,两次for循环
使用双指针:
从前面知道,
L
(
i
)
L(i)
L(i)和
R
(
i
)
R(i)
R(i)分别从0,n-1开始计算,最后就是对应元素相乘
所以,可以只有一个数组,初始化全1,然后开始计算
L
(
i
)
L(i)
L(i)和
R
(
i
)
R(i)
R(i),
- 当两个i相遇之前,计算 L ( i ) L(i) L(i)和 R ( i ) R(i) R(i)
- 当两个i相遇之后,计算 L ( i ) L(i) L(i)* R ( i ) R(i) R(i)
实现代码:
class Solution {
public int[] productExceptSelf(int[] nums) {
int n = nums.length;
int[] ans = new int[n];
ans[0] = 1;
for(int i= 1;i < n; i++){
ans[i] = nums[i-1] * ans[i-1];
}
int R = 1;
for(int i = n -1 ;i >=0; i--){
ans[i] = R * ans[i];
R = R * nums[i];
}
return ans;
}
}
- 双指针
class Solution {
public int[] productExceptSelf(int[] nums) {
int n = nums.length;
int[] ans = new int[n];
Arrays.fill(ans, 1);
int l = 0, r = n-1 ,ll = 1 ,rr = 1;
while(l < n && r >=0){
ans[l] = ans[l] * ll;
ans[r] = ans[r] * rr;
ll = nums[l++] * ll;
rr = nums[r--] * rr;
}
return ans;
}
}