Skip to content

Commit 72aac94

Browse files
committed
feat: add solutions to lc problem: No.2367
No.2367.Number of Arithmetic Triplets
1 parent 1b8e686 commit 72aac94

File tree

7 files changed

+101
-124
lines changed

7 files changed

+101
-124
lines changed

solution/2300-2399/2367.Number of Arithmetic Triplets/README.md

Lines changed: 41 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -53,35 +53,24 @@
5353

5454
**方法一:暴力枚举**
5555

56-
直接暴力枚举 $i$, $j$, $k$,统计合法的三元组数目
56+
我们注意到,数组 $nums$ 的长度只有不超过 $200$,因此可以直接暴力枚举 $i$, $j$, $k$,判断是否满足条件,若满足,累加三元组数目
5757

58-
时间复杂度 $O(n^3)$,空间复杂度 $O(1)$。
58+
时间复杂度 $O(n^3)$,其中 $n$ 为数组 $nums$ 的长度。空间复杂度 $O(1)$。
5959

60-
**方法二:哈希表**
60+
**方法二:数组或哈希表**
6161

62-
由于 $nums$ 严格递增,那么对于 $nums$ 中的每个元素 $v$,判断 $v+diff$, $v+diff+diff$ 是否也在 $nums$ 中,若是,累加三元组数目。这里用哈希表实现元素的快速查找
62+
我们可以先将 $nums$ 中的元素存入哈希表或数组 $vis$ 中,然后枚举 $nums$ 中的每个元素 $x$,判断 $x+diff$, $x+diff+diff$ 是否也在 $vis$ 中,若是,累加三元组数目。
6363

64-
时间复杂度 $O(n)$,空间复杂度 $O(n)$。
64+
枚举结束后,返回答案。
65+
66+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 $nums$ 的长度。
6567

6668
<!-- tabs:start -->
6769

6870
### **Python3**
6971

7072
<!-- 这里可写当前语言的特殊实现逻辑 -->
7173

72-
```python
73-
class Solution:
74-
def arithmeticTriplets(self, nums: List[int], diff: int) -> int:
75-
ans = 0
76-
n = len(nums)
77-
for i in range(n):
78-
for j in range(i + 1, n):
79-
for k in range(j + 1, n):
80-
if nums[j] - nums[i] == nums[k] - nums[j] == diff:
81-
ans += 1
82-
return ans
83-
```
84-
8574
```python
8675
class Solution:
8776
def arithmeticTriplets(self, nums: List[int], diff: int) -> int:
@@ -91,8 +80,8 @@ class Solution:
9180
```python
9281
class Solution:
9382
def arithmeticTriplets(self, nums: List[int], diff: int) -> int:
94-
s = set(nums)
95-
return sum(v + diff in s and v + diff + diff in s for v in nums)
83+
vis = set(nums)
84+
return sum(x + diff in vis and x + diff * 2 in vis for x in nums)
9685
```
9786

9887
### **Java**
@@ -121,13 +110,13 @@ class Solution {
121110
```java
122111
class Solution {
123112
public int arithmeticTriplets(int[] nums, int diff) {
124-
boolean[] vis = new boolean[310];
125-
for (int v : nums) {
126-
vis[v] = true;
113+
boolean[] vis = new boolean[301];
114+
for (int x : nums) {
115+
vis[x] = true;
127116
}
128117
int ans = 0;
129-
for (int v : nums) {
130-
if (vis[v + diff] && vis[v + diff + diff]) {
118+
for (int x : nums) {
119+
if (vis[x + diff] && vis[x + diff + diff]) {
131120
++ans;
132121
}
133122
}
@@ -162,10 +151,14 @@ public:
162151
class Solution {
163152
public:
164153
int arithmeticTriplets(vector<int>& nums, int diff) {
165-
vector<bool> vis(310);
166-
for (int v : nums) vis[v] = true;
154+
bitset<301> vis;
155+
for (int x : nums) {
156+
vis[x] = 1;
157+
}
167158
int ans = 0;
168-
for (int v : nums) ans += vis[v + diff] && vis[v + diff + diff];
159+
for (int x : nums) {
160+
ans += vis[x + diff] && vis[x + diff + diff];
161+
}
169162
return ans;
170163
}
171164
};
@@ -174,8 +167,7 @@ public:
174167
### **Go**
175168

176169
```go
177-
func arithmeticTriplets(nums []int, diff int) int {
178-
ans := 0
170+
func arithmeticTriplets(nums []int, diff int) (ans int) {
179171
n := len(nums)
180172
for i := 0; i < n; i++ {
181173
for j := i + 1; j < n; j++ {
@@ -186,57 +178,53 @@ func arithmeticTriplets(nums []int, diff int) int {
186178
}
187179
}
188180
}
189-
return ans
181+
return
190182
}
191183
```
192184

193185
```go
194-
func arithmeticTriplets(nums []int, diff int) int {
195-
vis := make([]bool, 310)
196-
for _, v := range nums {
197-
vis[v] = true
186+
func arithmeticTriplets(nums []int, diff int) (ans int) {
187+
vis := [301]bool{}
188+
for _, x := range nums {
189+
vis[x] = true
198190
}
199-
ans := 0
200-
for _, v := range nums {
201-
if vis[v+diff] && vis[v+diff+diff] {
191+
for _, x := range nums {
192+
if vis[x+diff] && vis[x+diff+diff] {
202193
ans++
203194
}
204195
}
205-
return ans
196+
return
206197
}
207198
```
208199

209200
### **TypeScript**
210201

211202
```ts
212203
function arithmeticTriplets(nums: number[], diff: number): number {
213-
let res = 0;
214204
const n = nums.length;
215-
for (let i = 0; i < n - 2; i++) {
216-
for (let j = i + 1; j < n - 1; j++) {
217-
for (let k = j + 1; k < n; k++) {
218-
if (nums[k] - nums[j] > diff) {
219-
break;
220-
}
205+
let ans = 0;
206+
for (let i = 0; i < n; ++i) {
207+
for (let j = i + 1; j < n; ++j) {
208+
for (let k = j + 1; k < n; ++k) {
221209
if (nums[j] - nums[i] === diff && nums[k] - nums[j] === diff) {
222-
res++;
210+
++ans;
223211
}
224212
}
225213
}
226214
}
227-
return res;
215+
return ans;
228216
}
229217
```
230218

231219
```ts
232220
function arithmeticTriplets(nums: number[], diff: number): number {
233-
let vis = new Array(310).fill(false);
234-
for (const v of nums) {
235-
vis[v] = true;
221+
const vis: boolean[] = new Array(301).fill(false);
222+
for (const x of nums) {
223+
vis[x] = true;
236224
}
237225
let ans = 0;
238-
for (const v of nums) {
239-
if (vis[v + diff] && vis[v + diff + diff]) {
226+
for (const x of nums) {
227+
if (vis[x + diff] && vis[x + diff + diff]) {
240228
++ans;
241229
}
242230
}

solution/2300-2399/2367.Number of Arithmetic Triplets/README_EN.md

Lines changed: 34 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -51,19 +51,6 @@
5151

5252
### **Python3**
5353

54-
```python
55-
class Solution:
56-
def arithmeticTriplets(self, nums: List[int], diff: int) -> int:
57-
ans = 0
58-
n = len(nums)
59-
for i in range(n):
60-
for j in range(i + 1, n):
61-
for k in range(j + 1, n):
62-
if nums[j] - nums[i] == nums[k] - nums[j] == diff:
63-
ans += 1
64-
return ans
65-
```
66-
6754
```python
6855
class Solution:
6956
def arithmeticTriplets(self, nums: List[int], diff: int) -> int:
@@ -73,8 +60,8 @@ class Solution:
7360
```python
7461
class Solution:
7562
def arithmeticTriplets(self, nums: List[int], diff: int) -> int:
76-
s = set(nums)
77-
return sum(v + diff in s and v + diff + diff in s for v in nums)
63+
vis = set(nums)
64+
return sum(x + diff in vis and x + diff * 2 in vis for x in nums)
7865
```
7966

8067
### **Java**
@@ -101,13 +88,13 @@ class Solution {
10188
```java
10289
class Solution {
10390
public int arithmeticTriplets(int[] nums, int diff) {
104-
boolean[] vis = new boolean[310];
105-
for (int v : nums) {
106-
vis[v] = true;
91+
boolean[] vis = new boolean[301];
92+
for (int x : nums) {
93+
vis[x] = true;
10794
}
10895
int ans = 0;
109-
for (int v : nums) {
110-
if (vis[v + diff] && vis[v + diff + diff]) {
96+
for (int x : nums) {
97+
if (vis[x + diff] && vis[x + diff + diff]) {
11198
++ans;
11299
}
113100
}
@@ -142,10 +129,14 @@ public:
142129
class Solution {
143130
public:
144131
int arithmeticTriplets(vector<int>& nums, int diff) {
145-
vector<bool> vis(310);
146-
for (int v : nums) vis[v] = true;
132+
bitset<301> vis;
133+
for (int x : nums) {
134+
vis[x] = 1;
135+
}
147136
int ans = 0;
148-
for (int v : nums) ans += vis[v + diff] && vis[v + diff + diff];
137+
for (int x : nums) {
138+
ans += vis[x + diff] && vis[x + diff + diff];
139+
}
149140
return ans;
150141
}
151142
};
@@ -154,8 +145,7 @@ public:
154145
### **Go**
155146

156147
```go
157-
func arithmeticTriplets(nums []int, diff int) int {
158-
ans := 0
148+
func arithmeticTriplets(nums []int, diff int) (ans int) {
159149
n := len(nums)
160150
for i := 0; i < n; i++ {
161151
for j := i + 1; j < n; j++ {
@@ -166,57 +156,53 @@ func arithmeticTriplets(nums []int, diff int) int {
166156
}
167157
}
168158
}
169-
return ans
159+
return
170160
}
171161
```
172162

173163
```go
174-
func arithmeticTriplets(nums []int, diff int) int {
175-
vis := make([]bool, 310)
176-
for _, v := range nums {
177-
vis[v] = true
164+
func arithmeticTriplets(nums []int, diff int) (ans int) {
165+
vis := [301]bool{}
166+
for _, x := range nums {
167+
vis[x] = true
178168
}
179-
ans := 0
180-
for _, v := range nums {
181-
if vis[v+diff] && vis[v+diff+diff] {
169+
for _, x := range nums {
170+
if vis[x+diff] && vis[x+diff+diff] {
182171
ans++
183172
}
184173
}
185-
return ans
174+
return
186175
}
187176
```
188177

189178
### **TypeScript**
190179

191180
```ts
192181
function arithmeticTriplets(nums: number[], diff: number): number {
193-
let res = 0;
194182
const n = nums.length;
195-
for (let i = 0; i < n - 2; i++) {
196-
for (let j = i + 1; j < n - 1; j++) {
197-
for (let k = j + 1; k < n; k++) {
198-
if (nums[k] - nums[j] > diff) {
199-
break;
200-
}
183+
let ans = 0;
184+
for (let i = 0; i < n; ++i) {
185+
for (let j = i + 1; j < n; ++j) {
186+
for (let k = j + 1; k < n; ++k) {
201187
if (nums[j] - nums[i] === diff && nums[k] - nums[j] === diff) {
202-
res++;
188+
++ans;
203189
}
204190
}
205191
}
206192
}
207-
return res;
193+
return ans;
208194
}
209195
```
210196

211197
```ts
212198
function arithmeticTriplets(nums: number[], diff: number): number {
213-
let vis = new Array(310).fill(false);
214-
for (const v of nums) {
215-
vis[v] = true;
199+
const vis: boolean[] = new Array(301).fill(false);
200+
for (const x of nums) {
201+
vis[x] = true;
216202
}
217203
let ans = 0;
218-
for (const v of nums) {
219-
if (vis[v + diff] && vis[v + diff + diff]) {
204+
for (const x of nums) {
205+
if (vis[x + diff] && vis[x + diff + diff]) {
220206
++ans;
221207
}
222208
}
Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
class Solution {
22
public:
33
int arithmeticTriplets(vector<int>& nums, int diff) {
4-
vector<bool> vis(310);
5-
for (int v : nums) vis[v] = true;
4+
bitset<301> vis;
5+
for (int x : nums) {
6+
vis[x] = 1;
7+
}
68
int ans = 0;
7-
for (int v : nums) ans += vis[v + diff] && vis[v + diff + diff];
9+
for (int x : nums) {
10+
ans += vis[x + diff] && vis[x + diff + diff];
11+
}
812
return ans;
913
}
1014
};
Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
func arithmeticTriplets(nums []int, diff int) int {
2-
vis := make([]bool, 310)
3-
for _, v := range nums {
4-
vis[v] = true
1+
func arithmeticTriplets(nums []int, diff int) (ans int) {
2+
vis := [301]bool{}
3+
for _, x := range nums {
4+
vis[x] = true
55
}
6-
ans := 0
7-
for _, v := range nums {
8-
if vis[v+diff] && vis[v+diff+diff] {
6+
for _, x := range nums {
7+
if vis[x+diff] && vis[x+diff+diff] {
98
ans++
109
}
1110
}
12-
return ans
11+
return
1312
}

solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
class Solution {
22
public int arithmeticTriplets(int[] nums, int diff) {
3-
boolean[] vis = new boolean[310];
4-
for (int v : nums) {
5-
vis[v] = true;
3+
boolean[] vis = new boolean[301];
4+
for (int x : nums) {
5+
vis[x] = true;
66
}
77
int ans = 0;
8-
for (int v : nums) {
9-
if (vis[v + diff] && vis[v + diff + diff]) {
8+
for (int x : nums) {
9+
if (vis[x + diff] && vis[x + diff + diff]) {
1010
++ans;
1111
}
1212
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
class Solution:
22
def arithmeticTriplets(self, nums: List[int], diff: int) -> int:
3-
s = set(nums)
4-
return sum(v + diff in s and v + diff + diff in s for v in nums)
3+
vis = set(nums)
4+
return sum(x + diff in vis and x + diff * 2 in vis for x in nums)

0 commit comments

Comments
 (0)