Skip to content

Commit 802862a

Browse files
committed
feat: update solutions to lc problem: No.0238
No.0238.Product of Array Except Self
1 parent 6e8f853 commit 802862a

File tree

5 files changed

+33
-53
lines changed

5 files changed

+33
-53
lines changed

solution/0200-0299/0237.Delete Node in a Linked List/README.md

+2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242

4343
<!-- 这里可写通用的实现逻辑 -->
4444

45+
**方法一:节点赋值**
46+
4547
`node.next` 节点的值赋给 `node`,然后将 `node.next` 指向 `node.next` 的下一个节点。
4648

4749
<!-- tabs:start -->

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

+7-17
Original file line numberDiff line numberDiff line change
@@ -196,29 +196,19 @@ function productExceptSelf(nums: number[]): number[] {
196196

197197
### **Go**
198198

199-
利用前缀和思想,分别求出 `i` 左右两侧的乘积
200-
201199
```go
202200
func productExceptSelf(nums []int) []int {
203201
n := len(nums)
204-
205-
l := make([]int, n)
206-
l[0] = 1
207-
for i := 1; i < n; i++ {
208-
l[i] = l[i-1] * nums[i-1]
209-
}
210-
211-
r := make([]int, n)
212-
r[n-1] = 1
213-
for i := n - 2; i >= 0; i-- {
214-
r[i] = r[i+1] * nums[i+1]
215-
}
216-
217202
ans := make([]int, n)
203+
left, right := 1, 1
218204
for i := 0; i < n; i++ {
219-
ans[i] = l[i] * r[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]
220211
}
221-
222212
return ans
223213
}
224214
```

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

+7-15
Original file line numberDiff line numberDiff line change
@@ -124,24 +124,16 @@ function productExceptSelf(nums: number[]): number[] {
124124
```go
125125
func productExceptSelf(nums []int) []int {
126126
n := len(nums)
127-
128-
l := make([]int, n)
129-
l[0] = 1
130-
for i := 1; i < n; i++ {
131-
l[i] = l[i-1] * nums[i-1]
132-
}
133-
134-
r := make([]int, n)
135-
r[n-1] = 1
136-
for i := n - 2; i >= 0; i-- {
137-
r[i] = r[i+1] * nums[i+1]
138-
}
139-
140127
ans := make([]int, n)
128+
left, right := 1, 1
141129
for i := 0; i < n; i++ {
142-
ans[i] = l[i] * r[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]
143136
}
144-
145137
return ans
146138
}
147139
```
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,14 @@
11
func productExceptSelf(nums []int) []int {
22
n := len(nums)
3-
4-
l := make([]int, n)
5-
l[0] = 1
6-
for i := 1; i < n; i++ {
7-
l[i] = l[i-1] * nums[i-1]
8-
}
9-
10-
r := make([]int, n)
11-
r[n-1] = 1
12-
for i := n - 2; i >= 0; i-- {
13-
r[i] = r[i+1] * nums[i+1]
14-
}
15-
163
ans := make([]int, n)
4+
left, right := 1, 1
175
for i := 0; i < n; i++ {
18-
ans[i] = l[i] * r[i]
6+
ans[i] = left
7+
left *= nums[i]
8+
}
9+
for i := n - 1; i >= 0; i-- {
10+
ans[i] *= right
11+
right *= nums[i]
1912
}
20-
2113
return ans
22-
}
14+
}

solution/0200-0299/0292.Nim Game/README.md

+9-5
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,19 @@
5757

5858
<!-- 这里可写通用的实现逻辑 -->
5959

60-
第一个得到 4 的倍数(即 n % 4 == 0)的将会输掉比赛。
60+
**方法一:数学推理**
61+
62+
第一个得到 $4$ 的倍数(即 $n$ 能被 $4$ 整除)的将会输掉比赛。
6163

6264
证明:
6365

64-
1.`n == 4`,无论第一个玩家选择 1/2/3 哪个数字,第二个玩家总能选择剩下的数字,**第一个玩家将会输掉比赛**
65-
1.`4 < n < 8`,即 (n = 5,6,7),第一个玩家可以相应地将数字减少为 4,那么 4 这个死亡数字给到了第二个玩家,第二个玩家将会输掉比赛。
66-
1.`n == 8`,无论第一个玩家选择 1/2/3 哪个数字,都会把 `4 < n < 8` 的数字留给第二个,**第一个玩家将会输掉比赛**
66+
1.$n=4$,无论第一个玩家选择 $1/2/3$ 哪个数字,第二个玩家总能选择剩下的数字,**第一个玩家将会输掉比赛**
67+
1.$4<n<8$,即 ($n=5,6,7$),第一个玩家可以相应地将数字减少为 $4$,那么 $4$ 这个死亡数字给到了第二个玩家,第二个玩家将会输掉比赛。
68+
1.$n=8$,无论第一个玩家选择 $1/2/3$ 哪个数字,都会把 $4<n<8$ 的数字留给第二个,**第一个玩家将会输掉比赛**
6769
1. ...
68-
1. 依次类推,当玩家拿到 n 这个数字,且 n 能被 4 整除,即 `n % 4 == 0`,他将会输掉比赛,否则他将赢得比赛。
70+
1. 依次类推,当玩家拿到 $n$ 这个数字,且 $n$ 能被 $4$ 整除,他将会输掉比赛,否则他将赢得比赛。
71+
72+
时间复杂度 $O(1)$。
6973

7074
<!-- tabs:start -->
7175

0 commit comments

Comments
 (0)