1、数据结构:一维数组 pre 和 sub 分别存放 nums[i] 对应 i 的前缀和后缀的乘积。
2、双指针:对 nums 进行遍历,在遍历的过程完成对 pre 和 sub 的填写。之后对 pre 和 sub 进行遍历,在对应的位置上相乘,得到最终的answer。
优化:对空间复杂度进行优化,因为ans本身数据结构与pre和sub一致,所以直接用ans代替pre,在第二次遍历nums的过程中,维护整型结构sub(初值为1),保存位置i对应后缀的乘积(实现见Java版的代码)
Go
func productExceptSelf(nums []int) []int {
var length int=len(nums)
var pre, sub, answer []int=make([]int, length), make([]int, length), make([]int, length)
pre[0], sub[length-1]=1, 1
for i:=1; i<length; i++{
pre[i]=pre[i-1]*nums[i-1]
sub[length-i-1]=sub[length-i]*nums[length-i]
}
for k, _:=range nums{ answer[k]=pre[k]*sub[k] }
return answer
}
Java
class Solution {
public int[] productExceptSelf(int[] nums) {
int len=nums.length;
int[] ans=new int[len];
ans[0]=1;
int sub=1;
for(int i=1; i<len; i++){ ans[i]=ans[i-1]*nums[i-1]; }
for(int j=len-1; j>=0; j--){
ans[j]=ans[j]*sub;
sub=sub*nums[j];
}
return ans;
}
}
每次都能想到正确解法,但每次都想的不完整,唉😔