Skip to content

Commit bf00513

Browse files
Create 238. 除自身以外数组的乘积.md
1 parent c27cadb commit bf00513

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
#### 238. 除自身以外数组的乘积
2+
3+
难度:中等
4+
5+
---
6+
7+
给你一个整数数组 `nums`,返回 数组 `answer` ,其中 `answer[i]` 等于 `nums` 中除 `nums[i]` 之外其余各元素的乘积 。
8+
9+
题目数据 **保证** 数组 `nums`之中任意元素的全部前缀元素和后缀的乘积都在  **32 位** 整数范围内。
10+
11+
请  **不要使用除法,** 且在 `O(n)` 时间复杂度内完成此题。
12+
13+
**示例 1:**
14+
15+
```
16+
输入: nums = [1,2,3,4]
17+
输出: [24,12,8,6]
18+
```
19+
20+
**示例 2:**
21+
22+
```
23+
输入: nums = [-1,1,0,-3,3]
24+
输出: [0,0,9,0,0]
25+
```
26+
27+
**提示:**
28+
29+
* `2 <= nums.length <= 10^5`
30+
* `-30 <= nums[i] <= 30`
31+
* **保证** 数组 `nums`之中任意元素的全部前缀元素和后缀的乘积都在  **32 位** 整数范围内
32+
33+
**进阶:** 你可以在 `O(1)` 的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组  **不被视为**  额外空间。)
34+
35+
---
36+
37+
法一:
38+
39+
利用两个数组分别从左往右/从右往左遍历,记录除当前下标值的前缀/后缀乘积,注意前缀数组的第一个值为一,后缀数组的最后一个值为一,最后再两者相乘即是输出数组
40+
41+
```go
42+
func productExceptSelf(nums []int) []int {
43+
n := len(nums)
44+
leftArray, rightArray, output := make([]int, n), make([]int, n), make([]int, n)
45+
for i := 0; i < n; i++ {
46+
if i == 0 {
47+
leftArray[i] = 1
48+
} else {
49+
leftArray[i] = leftArray[i - 1] * nums[i - 1]
50+
}
51+
}
52+
for i := n - 1; i >= 0; i-- {
53+
if i == n - 1 {
54+
rightArray[i] = 1
55+
} else {
56+
rightArray[i] = rightArray[i + 1] * nums[i + 1]
57+
}
58+
}
59+
for i := 0; i < n; i++ {
60+
output[i] = leftArray[i] * rightArray[i]
61+
}
62+
63+
return output
64+
}
65+
```
66+
67+
68+
69+
法二:
70+
71+
先在 `output` 输出数组上从左往右累乘,再从右往左累乘,用一个临时遍历记录从右往左累乘的数。
72+
73+
```Go
74+
func productExceptSelf(nums []int) []int {
75+
n := len(nums)
76+
output := make([]int, n)
77+
for i := 0; i < n; i++ {
78+
if i == 0 {
79+
output[i] = 1
80+
} else {
81+
output[i] = output[i - 1] * nums[i - 1]
82+
}
83+
}
84+
temp := 1
85+
for i := n - 1; i >= 0; i-- {
86+
if i != n - 1 {
87+
output[i] *= temp
88+
}
89+
temp *= nums[i]
90+
}
91+
return output
92+
}
93+
```

0 commit comments

Comments
 (0)