Skip to content

Commit bd281b2

Browse files
committed
feat: add solutions to lc problems: No.2367~2370
* No.2367.Number of Arithmetic Triplets * No.2368.Reachable Nodes With Restrictions * No.2369.Check if There is a Valid Partition For The Array * No.2370.Longest Ideal Subsequence
1 parent ec60fae commit bd281b2

File tree

12 files changed

+716
-49
lines changed

12 files changed

+716
-49
lines changed

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

+86-1
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,22 @@
4747
<li><code>nums</code> <strong>严格</strong> 递增</li>
4848
</ul>
4949

50-
5150
## 解法
5251

5352
<!-- 这里可写通用的实现逻辑 -->
5453

5554
**方法一:暴力枚举**
5655

56+
直接暴力枚举 $i$, $j$, $k$,统计合法的三元组数目。
57+
58+
时间复杂度 $O(n^3)$,空间复杂度 $O(1)$。
59+
60+
**方法二:哈希表**
61+
62+
由于 $nums$ 严格递增,那么对于 $nums$ 中的每个元素 $v$,判断 $v+diff$, $v+diff+diff$ 是否也在 $nums$ 中,若是,累加三元组数目。这里用哈希表实现元素的快速查找。
63+
64+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。
65+
5766
<!-- tabs:start -->
5867

5968
### **Python3**
@@ -73,6 +82,19 @@ class Solution:
7382
return ans
7483
```
7584

85+
```python
86+
class Solution:
87+
def arithmeticTriplets(self, nums: List[int], diff: int) -> int:
88+
return sum(b - a == diff and c - b == diff for a, b, c in combinations(nums, 3))
89+
```
90+
91+
```python
92+
class Solution:
93+
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)
96+
```
97+
7698
### **Java**
7799

78100
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -96,6 +118,24 @@ class Solution {
96118
}
97119
```
98120

121+
```java
122+
class Solution {
123+
public int arithmeticTriplets(int[] nums, int diff) {
124+
boolean[] vis = new boolean[310];
125+
for (int v : nums) {
126+
vis[v] = true;
127+
}
128+
int ans = 0;
129+
for (int v : nums) {
130+
if (vis[v + diff] && vis[v + diff + diff]) {
131+
++ans;
132+
}
133+
}
134+
return ans;
135+
}
136+
}
137+
```
138+
99139
### **C++**
100140

101141
```cpp
@@ -118,6 +158,19 @@ public:
118158
};
119159
```
120160
161+
```cpp
162+
class Solution {
163+
public:
164+
int arithmeticTriplets(vector<int>& nums, int diff) {
165+
vector<bool> vis(310);
166+
for (int v : nums) vis[v] = true;
167+
int ans = 0;
168+
for (int v : nums) ans += vis[v + diff] && vis[v + diff + diff];
169+
return ans;
170+
}
171+
};
172+
```
173+
121174
### **Go**
122175

123176
```go
@@ -137,6 +190,22 @@ func arithmeticTriplets(nums []int, diff int) int {
137190
}
138191
```
139192

193+
```go
194+
func arithmeticTriplets(nums []int, diff int) int {
195+
vis := make([]bool, 310)
196+
for _, v := range nums {
197+
vis[v] = true
198+
}
199+
ans := 0
200+
for _, v := range nums {
201+
if vis[v+diff] && vis[v+diff+diff] {
202+
ans++
203+
}
204+
}
205+
return ans
206+
}
207+
```
208+
140209
### **TypeScript**
141210

142211
```ts
@@ -159,6 +228,22 @@ function arithmeticTriplets(nums: number[], diff: number): number {
159228
}
160229
```
161230

231+
```ts
232+
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;
236+
}
237+
let ans = 0;
238+
for (const v of nums) {
239+
if (vis[v + diff] && vis[v + diff + diff]) {
240+
++ans;
241+
}
242+
}
243+
return ans;
244+
}
245+
```
246+
162247
### **...**
163248

164249
```

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

+76
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,19 @@ class Solution:
6565
return ans
6666
```
6767

68+
```python
69+
class Solution:
70+
def arithmeticTriplets(self, nums: List[int], diff: int) -> int:
71+
return sum(b - a == diff and c - b == diff for a, b, c in combinations(nums, 3))
72+
```
73+
74+
```python
75+
class Solution:
76+
def arithmeticTriplets(self, nums: List[int], diff: int) -> int:
77+
s = set(nums)
78+
return sum(v + diff in s and v + diff + diff in s for v in nums)
79+
```
80+
6881
### **Java**
6982

7083
```java
@@ -86,6 +99,24 @@ class Solution {
8699
}
87100
```
88101

102+
```java
103+
class Solution {
104+
public int arithmeticTriplets(int[] nums, int diff) {
105+
boolean[] vis = new boolean[310];
106+
for (int v : nums) {
107+
vis[v] = true;
108+
}
109+
int ans = 0;
110+
for (int v : nums) {
111+
if (vis[v + diff] && vis[v + diff + diff]) {
112+
++ans;
113+
}
114+
}
115+
return ans;
116+
}
117+
}
118+
```
119+
89120
### **C++**
90121

91122
```cpp
@@ -108,6 +139,19 @@ public:
108139
};
109140
```
110141
142+
```cpp
143+
class Solution {
144+
public:
145+
int arithmeticTriplets(vector<int>& nums, int diff) {
146+
vector<bool> vis(310);
147+
for (int v : nums) vis[v] = true;
148+
int ans = 0;
149+
for (int v : nums) ans += vis[v + diff] && vis[v + diff + diff];
150+
return ans;
151+
}
152+
};
153+
```
154+
111155
### **Go**
112156

113157
```go
@@ -127,6 +171,22 @@ func arithmeticTriplets(nums []int, diff int) int {
127171
}
128172
```
129173

174+
```go
175+
func arithmeticTriplets(nums []int, diff int) int {
176+
vis := make([]bool, 310)
177+
for _, v := range nums {
178+
vis[v] = true
179+
}
180+
ans := 0
181+
for _, v := range nums {
182+
if vis[v+diff] && vis[v+diff+diff] {
183+
ans++
184+
}
185+
}
186+
return ans
187+
}
188+
```
189+
130190
### **TypeScript**
131191

132192
```ts
@@ -149,6 +209,22 @@ function arithmeticTriplets(nums: number[], diff: number): number {
149209
}
150210
```
151211

212+
```ts
213+
function arithmeticTriplets(nums: number[], diff: number): number {
214+
let vis = new Array(310).fill(false);
215+
for (const v of nums) {
216+
vis[v] = true;
217+
}
218+
let ans = 0;
219+
for (const v of nums) {
220+
if (vis[v + diff] && vis[v + diff + diff]) {
221+
++ans;
222+
}
223+
}
224+
return ans;
225+
}
226+
```
227+
152228
### **...**
153229

154230
```
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,10 @@
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;
46
int ans = 0;
5-
int n = nums.size();
6-
for (int i = 0; i < n; ++i) {
7-
for (int j = i + 1; j < n; ++j) {
8-
for (int k = j + 1; k < n; ++k) {
9-
if (nums[j] - nums[i] == diff && nums[k] - nums[j] == diff) {
10-
++ans;
11-
}
12-
}
13-
}
14-
}
7+
for (int v : nums) ans += vis[v + diff] && vis[v + diff + diff];
158
return ans;
169
}
1710
};

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

+7-8
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
func arithmeticTriplets(nums []int, diff int) int {
2+
vis := make([]bool, 310)
3+
for _, v := range nums {
4+
vis[v] = true
5+
}
26
ans := 0
3-
n := len(nums)
4-
for i := 0; i < n; i++ {
5-
for j := i + 1; j < n; j++ {
6-
for k := j + 1; k < n; k++ {
7-
if nums[j]-nums[i] == diff && nums[k]-nums[j] == diff {
8-
ans++
9-
}
10-
}
7+
for _, v := range nums {
8+
if vis[v+diff] && vis[v+diff+diff] {
9+
ans++
1110
}
1211
}
1312
return ans

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

+7-8
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
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;
6+
}
37
int ans = 0;
4-
int n = nums.length;
5-
for (int i = 0; i < n; ++i) {
6-
for (int j = i + 1; j < n; ++j) {
7-
for (int k = j + 1; k < n; ++k) {
8-
if (nums[j] - nums[i] == diff && nums[k] - nums[j] == diff) {
9-
++ans;
10-
}
11-
}
8+
for (int v : nums) {
9+
if (vis[v + diff] && vis[v + diff + diff]) {
10+
++ans;
1211
}
1312
}
1413
return ans;
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
11
class Solution:
22
def arithmeticTriplets(self, nums: List[int], diff: int) -> int:
3-
ans = 0
4-
n = len(nums)
5-
for i in range(n):
6-
for j in range(i + 1, n):
7-
for k in range(j + 1, n):
8-
if nums[j] - nums[i] == nums[k] - nums[j] == diff:
9-
ans += 1
10-
return ans
3+
s = set(nums)
4+
return sum(v + diff in s and v + diff + diff in s for v in nums)
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
function arithmeticTriplets(nums: number[], diff: number): number {
2-
let res = 0;
3-
const n = nums.length;
4-
for (let i = 0; i < n - 2; i++) {
5-
for (let j = i + 1; j < n - 1; j++) {
6-
for (let k = j + 1; k < n; k++) {
7-
if (nums[k] - nums[j] > diff) {
8-
break;
9-
}
10-
if (nums[j] - nums[i] === diff && nums[k] - nums[j] === diff) {
11-
res++;
12-
}
13-
}
2+
let vis = new Array(310).fill(false);
3+
for (const v of nums) {
4+
vis[v] = true;
5+
}
6+
let ans = 0;
7+
for (const v of nums) {
8+
if (vis[v + diff] && vis[v + diff + diff]) {
9+
++ans;
1410
}
1511
}
16-
return res;
12+
return ans;
1713
}

0 commit comments

Comments
 (0)