LeetCode238. Product of Array Except Self
题意
给一个数组A,生成一个数组B,B[i] = A[0] x A[1] x..x A[i-1] x A[i+1] x..x A[n]
时间复杂度O(N),不能使用除法
思路
仔细看一下,其实每次计算B[i]就是前面i-1个元素相乘,乘上后面i+1个元素相乘。
所以只要预处理前缀积和后缀积即可。
代码
版本1 O(N),S(N)
123456789101112131415161718public class Solution {public int[] productExceptSelf(int[] nums) {int[] pre = new int[nums.length];//前缀积int[] sub = new int[nums.length];//后缀积int[] ans = new int[nums.length];pre[0] = nums[0];sub[nums.length-1]=nums[nums.length-1];for(int i = 1;i<nums.length;i++)pre[i] = pre[i-1]*nums[i];for(int i = nums.length-2;i>=0;i--)sub[i] = sub[i+1]*nums[i];ans[0] = sub[1];ans[nums.length-1]=pre[nums.length-2];for(int i = 1;i<nums.length-1;i++)ans[i] = pre[i-1]*sub[i+1];//前i-1个的积*后i+1个的积return ans;}}版本2 O(N),S(1)
123456789101112131415public class Solution {public int[] productExceptSelf(int[] nums) {int n = nums.length;int[] res = new int[n];res[0] = 1;for (int i = 1; i < n; i++)res[i] = res[i - 1] * nums[i - 1];//res[i]保存的是前i-1个数的积int right = 1;for (int i = n - 1; i >= 0; i--) {res[i] *= right;//当前的right值为后i+1个数的积right *= nums[i];//更新为后i个数的积}return res;}}