给你一个整数数组 nums
,返回 数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积 。
题目数据 保证 数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请 不要使用除法,且在 O(*n*)
时间复杂度内完成此题。
示例 1:
1 2
| 输入: nums = [1,2,3,4] 输出: [24,12,8,6]
|
示例 2:
提示:
2 <= nums.length <= 105
-30 <= nums[i] <= 30
- 保证 数组
nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内
前缀和后缀数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class Solution { public int[] productExceptSelf(int[] nums) { int len = nums.length; int[] lsum = new int[len]; int[] rsum = new int[len]; int[] ans = new int[len]; lsum[0] = 1; for(int i = 1; i <= len; i++){ lsum[i] = lsum[i-1] * nums[i-1]; } rsum[len-1] = 1; for(int i = len-2; i >= 0; i--){ rsum[i] = rsum[i+1] * nums[i+1]; } for(int i = 0; i < len; i++){ ans[i] = lsum[i] * rsum[i]; } return ans;
} }
|
时间复杂度:$O(n)$
空间复杂度:$O(n)$
直接在ans数组上操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Solution { public int[] productExceptSelf(int[] nums) { int len = nums.length; int[] ans = new int[len]; ans[0] = 1; for(int i = 1; i < len; i++){ ans[i] = ans[i-1] * nums[i-1]; } int rsum = 1; for(int i = len-1; i >= 0; i--){ ans[i] = ans[i] * rsum; rsum *= nums[i]; } return ans;
} }
|
时间复杂度:$O(n)$
空间复杂度:$O(1)$