时间复杂度:O(n)
解题思路
对于每个元素,都会将数组分为左右两部分,而我们要求的乘积就是这两部分的乘积。所以我们可以通过两次遍历,第一次从左向右遍历,确定每个元素左部分的乘积,并保存到res数组中(因为要求空间复杂度为O(1)),第二次从右向左遍历,确定右部分的乘积,然后将右部分的乘积乘左部分的乘积就是除自身以外数组的乘积。
AC代码
func productExceptSelf(nums []int) []int {
res:=make([]int,len(nums))
res[0]=1
for i:=1;i<len(nums);i++{
res[i]=res[i-1]*nums[i-1]
}
pro:=1
for i:=len(nums)-2;i>=0;i--{
pro*=nums[i+1]
res[i]*=pro
}
return res
}
感悟
由于要求时间复杂度为O(n),一开始想了几种一次遍历的方法,发现都不能求出,然后想既然一次遍历不能求出那就两次遍历?发现从左向右遍历一次和从右向左遍历一次刚好可以求出乘积。又因为要去空间复杂度为O(1),这没什么好说的,只更新输出数组就ok啦。