Skip to content

Commit 013aa6d

Browse files
committed
feat: add solutions to lc problem: No.0238
No.0238.Product of Array Except Self
1 parent a1c763e commit 013aa6d

File tree

4 files changed

+96
-143
lines changed

4 files changed

+96
-143
lines changed

solution/0200-0299/0238.Product of Array Except Self/README.md

Lines changed: 48 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -46,62 +46,15 @@
4646

4747
<!-- 这里可写通用的实现逻辑 -->
4848

49-
**暴力:**
50-
51-
正常计算除自身之外的乘积。
52-
53-
```txt
54-
PRODUCT_EXCEPT_SELF(A)
55-
n = A.length
56-
let r[0..n]be a new array
57-
for i = 0 in n
58-
s = 1
59-
for j = 0 in n
60-
if j == i
61-
continue
62-
s *= A[j]
63-
r[i] = s
64-
return r
65-
```
66-
67-
**左右乘积:**
68-
69-
分别从左至右,从右至左累乘一次即可。
70-
71-
```txt
72-
PRODUCT_EXCEPT_SELF(A)
73-
n = A.length
74-
let r[0..n]be a new array
75-
p = 1
76-
q = 1
77-
for i = 0 in n
78-
r[i] = p
79-
p *= A[i]
80-
for i = n - 1 in 0 downto
81-
r[i] *= q
82-
q *= A[i]
83-
return r
84-
```
49+
**方法一:两次遍历**
8550

86-
可行性说明:
51+
我们定义两个变量 `left``right`,分别表示当前元素左边所有元素的乘积和右边所有元素的乘积。对于数组中的第一个元素,左边没有元素,所以 `left = 1`;对于数组中的最后一个元素,右边没有元素,所以 `right = 1`。用一个长度为 $n$ 的数组 `ans` 来存储最终的答案。
8752

88-
`nums = [1, 2, 3, 4]` 为例
53+
我们先从左到右遍历数组,对于遍历到的第 $i$ 个元素,我们用 `left` 更新 `ans[i]` 的值,然后 `left` 乘以 `nums[i]`
8954

90-
`r[i]` 的数值由 `nums[0..i - 1]` 的数值乘积所决定。在遍历结束后,最后一个元素得到了最终结果(因为累乘了前方所有数值)
55+
接下来,我们从右到左遍历数组,对于遍历到的第 $i$ 个元素,我们将 `ans[i]` 乘以 `right`,然后 `right` 乘以 `nums[i]`
9156

92-
```txt
93-
nums: [1, 2, 3, 4]
94-
r: [1, 1, 2, 6]
95-
p: [1, 2, 6, 24]
96-
```
97-
98-
而其他位置的数值,距离结果还差什么呢,那就是相对自身,后方所有数值的乘积,于是就有了第二次,从后往前的过程。
99-
100-
```txt
101-
nums: [1, 2, 3, 4]
102-
r: [24, 12, 8, 6]
103-
p: [24, 24, 12, 4]
104-
```
57+
时间复杂度 $O(n)$,忽略答案的空间消耗,空间复杂度 $O(1)$。其中 $n$ 是数组的长度。
10558

10659
<!-- tabs:start -->
10760

@@ -113,11 +66,11 @@ nums: [1, 2, 3, 4]
11366
class Solution:
11467
def productExceptSelf(self, nums: List[int]) -> List[int]:
11568
n = len(nums)
116-
ans = [1] * n
69+
ans = [0] * n
11770
left = right = 1
118-
for i in range(n):
71+
for i, v in enumerate(nums):
11972
ans[i] = left
120-
left *= nums[i]
73+
left *= v
12174
for i in range(n - 1, -1, -1):
12275
ans[i] *= right
12376
right *= nums[i]
@@ -146,6 +99,46 @@ class Solution {
14699
}
147100
```
148101

102+
### **C++**
103+
104+
```cpp
105+
class Solution {
106+
public:
107+
vector<int> productExceptSelf(vector<int>& nums) {
108+
int n = nums.size();
109+
vector<int> ans(n);
110+
for (int i = 0, left = 1; i < n; ++i) {
111+
ans[i] = left;
112+
left *= nums[i];
113+
}
114+
for (int i = n - 1, right = 1; i >= 0; --i) {
115+
ans[i] *= right;
116+
right *= nums[i];
117+
}
118+
return ans;
119+
}
120+
};
121+
```
122+
123+
### **Go**
124+
125+
```go
126+
func productExceptSelf(nums []int) []int {
127+
n := len(nums)
128+
ans := make([]int, n)
129+
left, right := 1, 1
130+
for i, v := range nums {
131+
ans[i] = left
132+
left *= v
133+
}
134+
for i := n - 1; i >= 0; i-- {
135+
ans[i] *= right
136+
right *= nums[i]
137+
}
138+
return ans
139+
}
140+
```
141+
149142
### **JavaScript**
150143

151144
```js
@@ -194,46 +187,6 @@ function productExceptSelf(nums: number[]): number[] {
194187
}
195188
```
196189

197-
### **Go**
198-
199-
```go
200-
func productExceptSelf(nums []int) []int {
201-
n := len(nums)
202-
ans := make([]int, n)
203-
left, right := 1, 1
204-
for i := 0; i < n; i++ {
205-
ans[i] = left
206-
left *= nums[i]
207-
}
208-
for i := n - 1; i >= 0; i-- {
209-
ans[i] *= right
210-
right *= nums[i]
211-
}
212-
return ans
213-
}
214-
```
215-
216-
### **C++**
217-
218-
```cpp
219-
class Solution {
220-
public:
221-
vector<int> productExceptSelf(vector<int>& nums) {
222-
int n = nums.size();
223-
vector<int> ans(n);
224-
for (int i = 0, left = 1; i < n; ++i) {
225-
ans[i] = left;
226-
left *= nums[i];
227-
}
228-
for (int i = n - 1, right = 1; i >= 0; --i) {
229-
ans[i] *= right;
230-
right *= nums[i];
231-
}
232-
return ans;
233-
}
234-
};
235-
```
236-
237190
### **Rust**
238191

239192
```rust

solution/0200-0299/0238.Product of Array Except Self/README_EN.md

Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@
4040
class Solution:
4141
def productExceptSelf(self, nums: List[int]) -> List[int]:
4242
n = len(nums)
43-
ans = [1] * n
43+
ans = [0] * n
4444
left = right = 1
45-
for i in range(n):
45+
for i, v in enumerate(nums):
4646
ans[i] = left
47-
left *= nums[i]
47+
left *= v
4848
for i in range(n - 1, -1, -1):
4949
ans[i] *= right
5050
right *= nums[i]
@@ -71,6 +71,46 @@ class Solution {
7171
}
7272
```
7373

74+
### **C++**
75+
76+
```cpp
77+
class Solution {
78+
public:
79+
vector<int> productExceptSelf(vector<int>& nums) {
80+
int n = nums.size();
81+
vector<int> ans(n);
82+
for (int i = 0, left = 1; i < n; ++i) {
83+
ans[i] = left;
84+
left *= nums[i];
85+
}
86+
for (int i = n - 1, right = 1; i >= 0; --i) {
87+
ans[i] *= right;
88+
right *= nums[i];
89+
}
90+
return ans;
91+
}
92+
};
93+
```
94+
95+
### **Go**
96+
97+
```go
98+
func productExceptSelf(nums []int) []int {
99+
n := len(nums)
100+
ans := make([]int, n)
101+
left, right := 1, 1
102+
for i, v := range nums {
103+
ans[i] = left
104+
left *= v
105+
}
106+
for i := n - 1; i >= 0; i-- {
107+
ans[i] *= right
108+
right *= nums[i]
109+
}
110+
return ans
111+
}
112+
```
113+
74114
### **JavaScript**
75115

76116
```js
@@ -119,46 +159,6 @@ function productExceptSelf(nums: number[]): number[] {
119159
}
120160
```
121161

122-
### **Go**
123-
124-
```go
125-
func productExceptSelf(nums []int) []int {
126-
n := len(nums)
127-
ans := make([]int, n)
128-
left, right := 1, 1
129-
for i := 0; i < n; i++ {
130-
ans[i] = left
131-
left *= nums[i]
132-
}
133-
for i := n - 1; i >= 0; i-- {
134-
ans[i] *= right
135-
right *= nums[i]
136-
}
137-
return ans
138-
}
139-
```
140-
141-
### **C++**
142-
143-
```cpp
144-
class Solution {
145-
public:
146-
vector<int> productExceptSelf(vector<int>& nums) {
147-
int n = nums.size();
148-
vector<int> ans(n);
149-
for (int i = 0, left = 1; i < n; ++i) {
150-
ans[i] = left;
151-
left *= nums[i];
152-
}
153-
for (int i = n - 1, right = 1; i >= 0; --i) {
154-
ans[i] *= right;
155-
right *= nums[i];
156-
}
157-
return ans;
158-
}
159-
};
160-
```
161-
162162
### **Rust**
163163

164164
```rust

solution/0200-0299/0238.Product of Array Except Self/Solution.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ func productExceptSelf(nums []int) []int {
22
n := len(nums)
33
ans := make([]int, n)
44
left, right := 1, 1
5-
for i := 0; i < n; i++ {
5+
for i, v := range nums {
66
ans[i] = left
7-
left *= nums[i]
7+
left *= v
88
}
99
for i := n - 1; i >= 0; i-- {
1010
ans[i] *= right

solution/0200-0299/0238.Product of Array Except Self/Solution.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
class Solution:
22
def productExceptSelf(self, nums: List[int]) -> List[int]:
33
n = len(nums)
4-
ans = [1] * n
4+
ans = [0] * n
55
left = right = 1
6-
for i in range(n):
6+
for i, v in enumerate(nums):
77
ans[i] = left
8-
left *= nums[i]
8+
left *= v
99
for i in range(n - 1, -1, -1):
1010
ans[i] *= right
1111
right *= nums[i]

0 commit comments

Comments
 (0)