题目链接
https://leetcode-cn.com/problems/product-of-array-except-self/
题意
中文题,就是给出一个数组,输出也是一个数组,每个位置是除自身外其他所有数的乘积。要求不能用除法,以及时间复杂度为O(n)。进阶的条件是常数的空间复杂度。
题解
也是比较有趣的题,不能用乘法,很想知道oj怎么知道有没有用除法,难道是看代码有没有符号“*”么= =。不过在O(n)时间复杂度下还是能写出来的。能用除法的话,就是第一轮遍历,直接求所有数的乘积,然后第二轮遍历就除以原数得到答案。如果不能用除法,那么就可以考虑,除了本身,将两边的乘积再相乘。不过这样时间复杂度就是O(n^2)了。
我的想法是,如果能遍历两轮,第一轮正常乘,第二轮反向正常乘,这样对于i而言,[0,i-1]的就是左边的正确乘积,那么反向正常乘的时候,[i+1,len-1]的乘积就是右边的正确乘积。同时为了满足常数级的空间复杂度,第一轮正向就直接在答案数组上进行,反向的时候,利用temp,反向直接确定正确答案。
表达不太清楚感觉,直接撸代码吧,速度还是能保证的。
Java代码
class Solution {
public int[] productExceptSelf(int[] nums) {
int len = nums.length;
int[] ans = new int[len];
ans[0] = nums[0];
for(int i = 1;i < len-1;i++){
ans[i] = nums[i]*ans[i-1];
}
ans[len-1] = ans[len-2];
int temp = nums[len-1];
for(int i = len-2;i >= 1;i--){
ans[i] = ans[i-1]*temp;
temp *= nums[i];
}
ans[0] = temp;
return ans;
}
}