Skip to content

Commit 173ebad

Browse files
committed
feat: add solutions to lc problem: No.1213
No.1213.Intersection of Three Sorted Arrays
1 parent fc1606c commit 173ebad

File tree

6 files changed

+217
-187
lines changed

6 files changed

+217
-187
lines changed

solution/1200-1299/1213.Intersection of Three Sorted Arrays/README.md

Lines changed: 96 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,17 @@
3838

3939
<!-- 这里可写通用的实现逻辑 -->
4040

41-
二分查找。
41+
**方法一:计数**
42+
43+
遍历三个数组,统计每个数字出现的次数,然后遍历任意一个数组,若某个数字出现的次数为 $3$,则将其加入结果数组。
44+
45+
时间复杂度 $O(n)$,空间复杂度 $O(m)$。其中 $n$ 和 $m$ 分别为数组的长度和数组中数字的范围。
46+
47+
**方法二:二分查找**
48+
49+
遍历第一个数组,对于其中的每个数字,使用二分查找在第二个数组和第三个数组中查找该数字,若都找到,则将该数字加入结果数组。
50+
51+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(1)$。其中 $n$ 为数组的长度。
4252

4353
<!-- tabs:start -->
4454

@@ -51,21 +61,20 @@ class Solution:
5161
def arraysIntersection(
5262
self, arr1: List[int], arr2: List[int], arr3: List[int]
5363
) -> List[int]:
54-
def find(arr, val):
55-
left, right = 0, len(arr) - 1
56-
while left < right:
57-
mid = (left + right) >> 1
58-
if arr[mid] >= val:
59-
right = mid
60-
else:
61-
left = mid + 1
62-
return arr[left] == val
63-
64-
res = []
65-
for num in arr1:
66-
if find(arr2, num) and find(arr3, num):
67-
res.append(num)
68-
return res
64+
cnt = Counter(arr1 + arr2 + arr3)
65+
return [x for x in arr1 if cnt[x] == 3]
66+
```
67+
68+
```python
69+
class Solution:
70+
def arraysIntersection(self, arr1: List[int], arr2: List[int], arr3: List[int]) -> List[int]:
71+
ans = []
72+
for x in arr1:
73+
i = bisect_left(arr2, x)
74+
j = bisect_left(arr3, x)
75+
if i < len(arr2) and j < len(arr3) and arr2[i] == x and arr3[j] == x:
76+
ans.append(x)
77+
return ans
6978
```
7079

7180
### **Java**
@@ -75,26 +84,36 @@ class Solution:
7584
```java
7685
class Solution {
7786
public List<Integer> arraysIntersection(int[] arr1, int[] arr2, int[] arr3) {
78-
List<Integer> res = new ArrayList<>();
79-
for (int num : arr1) {
80-
if (find(arr2, num) && find(arr3, num)) {
81-
res.add(num);
87+
List<Integer> ans = new ArrayList<>();
88+
int[] cnt = new int[2001];
89+
for (int x : arr1) {
90+
++cnt[x];
91+
}
92+
for (int x : arr2) {
93+
++cnt[x];
94+
}
95+
for (int x : arr3) {
96+
if (++cnt[x] == 3) {
97+
ans.add(x);
8298
}
8399
}
84-
return res;
100+
return ans;
85101
}
102+
}
103+
```
86104

87-
private boolean find(int[] arr, int val) {
88-
int left = 0, right = arr.length - 1;
89-
while (left < right) {
90-
int mid = (left + right) >> 1;
91-
if (arr[mid] >= val) {
92-
right = mid;
93-
} else {
94-
left = mid + 1;
105+
```java
106+
class Solution {
107+
public List<Integer> arraysIntersection(int[] arr1, int[] arr2, int[] arr3) {
108+
List<Integer> ans = new ArrayList<>();
109+
for (int x : arr1) {
110+
int i = Arrays.binarySearch(arr2, x);
111+
int j = Arrays.binarySearch(arr3, x);
112+
if (i >= 0 && j >= 0) {
113+
ans.add(x);
95114
}
96115
}
97-
return arr[left] == val;
116+
return ans;
98117
}
99118
}
100119
```
@@ -105,55 +124,72 @@ class Solution {
105124
class Solution {
106125
public:
107126
vector<int> arraysIntersection(vector<int>& arr1, vector<int>& arr2, vector<int>& arr3) {
108-
vector<int> res;
109-
for (int num : arr1) {
110-
if (find(arr2, num) && find(arr3, num)) {
111-
res.push_back(num);
127+
vector<int> ans;
128+
int cnt[2001]{};
129+
for (int x : arr1) {
130+
++cnt[x];
131+
}
132+
for (int x : arr2) {
133+
++cnt[x];
134+
}
135+
for (int x : arr3) {
136+
if (++cnt[x] == 3) {
137+
ans.push_back(x);
112138
}
113139
}
114-
return res;
140+
return ans;
115141
}
142+
};
143+
```
116144
117-
private:
118-
bool find(vector<int>& arr, int val) {
119-
int left = 0, right = arr.size() - 1;
120-
while (left < right) {
121-
int mid = left + right >> 1;
122-
if (arr[mid] >= val) {
123-
right = mid;
124-
} else {
125-
left = mid + 1;
145+
```cpp
146+
class Solution {
147+
public:
148+
vector<int> arraysIntersection(vector<int>& arr1, vector<int>& arr2, vector<int>& arr3) {
149+
vector<int> ans;
150+
for (int x : arr1) {
151+
auto i = lower_bound(arr2.begin(), arr2.end(), x);
152+
auto j = lower_bound(arr3.begin(), arr3.end(), x);
153+
if (*i == x && *j == x) {
154+
ans.push_back(x);
126155
}
127156
}
128-
return arr[left] == val;
157+
return ans;
129158
}
130159
};
131160
```
132161

133162
### **Go**
134163

135164
```go
136-
func arraysIntersection(arr1 []int, arr2 []int, arr3 []int) []int {
137-
var res []int
138-
for _, num := range arr1 {
139-
if find(arr2, num) && find(arr3, num) {
140-
res = append(res, num)
165+
func arraysIntersection(arr1 []int, arr2 []int, arr3 []int) (ans []int) {
166+
cnt := [2001]int{}
167+
for _, x := range arr1 {
168+
cnt[x]++
169+
}
170+
for _, x := range arr2 {
171+
cnt[x]++
172+
}
173+
for _, x := range arr3 {
174+
cnt[x]++
175+
if cnt[x] == 3 {
176+
ans = append(ans, x)
141177
}
142178
}
143-
return res
179+
return
144180
}
181+
```
145182

146-
func find(arr []int, val int) bool {
147-
left, right := 0, len(arr)-1
148-
for left < right {
149-
mid := (left + right) >> 1
150-
if arr[mid] >= val {
151-
right = mid
152-
} else {
153-
left = mid + 1
183+
```go
184+
func arraysIntersection(arr1 []int, arr2 []int, arr3 []int) (ans []int) {
185+
for _, x := range arr1 {
186+
i := sort.SearchInts(arr2, x)
187+
j := sort.SearchInts(arr3, x)
188+
if i < len(arr2) && j < len(arr3) && arr2[i] == x && arr3[j] == x {
189+
ans = append(ans, x)
154190
}
155191
}
156-
return arr[left] == val
192+
return
157193
}
158194
```
159195

solution/1200-1299/1213.Intersection of Three Sorted Arrays/README_EN.md

Lines changed: 85 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -43,48 +43,57 @@ class Solution:
4343
def arraysIntersection(
4444
self, arr1: List[int], arr2: List[int], arr3: List[int]
4545
) -> List[int]:
46-
def find(arr, val):
47-
left, right = 0, len(arr) - 1
48-
while left < right:
49-
mid = (left + right) >> 1
50-
if arr[mid] >= val:
51-
right = mid
52-
else:
53-
left = mid + 1
54-
return arr[left] == val
55-
56-
res = []
57-
for num in arr1:
58-
if find(arr2, num) and find(arr3, num):
59-
res.append(num)
60-
return res
46+
cnt = Counter(arr1 + arr2 + arr3)
47+
return [x for x in arr1 if cnt[x] == 3]
48+
```
49+
50+
```python
51+
class Solution:
52+
def arraysIntersection(self, arr1: List[int], arr2: List[int], arr3: List[int]) -> List[int]:
53+
ans = []
54+
for x in arr1:
55+
i = bisect_left(arr2, x)
56+
j = bisect_left(arr3, x)
57+
if i < len(arr2) and j < len(arr3) and arr2[i] == x and arr3[j] == x:
58+
ans.append(x)
59+
return ans
6160
```
6261

6362
### **Java**
6463

6564
```java
6665
class Solution {
6766
public List<Integer> arraysIntersection(int[] arr1, int[] arr2, int[] arr3) {
68-
List<Integer> res = new ArrayList<>();
69-
for (int num : arr1) {
70-
if (find(arr2, num) && find(arr3, num)) {
71-
res.add(num);
67+
List<Integer> ans = new ArrayList<>();
68+
int[] cnt = new int[2001];
69+
for (int x : arr1) {
70+
++cnt[x];
71+
}
72+
for (int x : arr2) {
73+
++cnt[x];
74+
}
75+
for (int x : arr3) {
76+
if (++cnt[x] == 3) {
77+
ans.add(x);
7278
}
7379
}
74-
return res;
80+
return ans;
7581
}
82+
}
83+
```
7684

77-
private boolean find(int[] arr, int val) {
78-
int left = 0, right = arr.length - 1;
79-
while (left < right) {
80-
int mid = (left + right) >> 1;
81-
if (arr[mid] >= val) {
82-
right = mid;
83-
} else {
84-
left = mid + 1;
85+
```java
86+
class Solution {
87+
public List<Integer> arraysIntersection(int[] arr1, int[] arr2, int[] arr3) {
88+
List<Integer> ans = new ArrayList<>();
89+
for (int x : arr1) {
90+
int i = Arrays.binarySearch(arr2, x);
91+
int j = Arrays.binarySearch(arr3, x);
92+
if (i >= 0 && j >= 0) {
93+
ans.add(x);
8594
}
8695
}
87-
return arr[left] == val;
96+
return ans;
8897
}
8998
}
9099
```
@@ -95,55 +104,72 @@ class Solution {
95104
class Solution {
96105
public:
97106
vector<int> arraysIntersection(vector<int>& arr1, vector<int>& arr2, vector<int>& arr3) {
98-
vector<int> res;
99-
for (int num : arr1) {
100-
if (find(arr2, num) && find(arr3, num)) {
101-
res.push_back(num);
107+
vector<int> ans;
108+
int cnt[2001]{};
109+
for (int x : arr1) {
110+
++cnt[x];
111+
}
112+
for (int x : arr2) {
113+
++cnt[x];
114+
}
115+
for (int x : arr3) {
116+
if (++cnt[x] == 3) {
117+
ans.push_back(x);
102118
}
103119
}
104-
return res;
120+
return ans;
105121
}
122+
};
123+
```
106124
107-
private:
108-
bool find(vector<int>& arr, int val) {
109-
int left = 0, right = arr.size() - 1;
110-
while (left < right) {
111-
int mid = left + right >> 1;
112-
if (arr[mid] >= val) {
113-
right = mid;
114-
} else {
115-
left = mid + 1;
125+
```cpp
126+
class Solution {
127+
public:
128+
vector<int> arraysIntersection(vector<int>& arr1, vector<int>& arr2, vector<int>& arr3) {
129+
vector<int> ans;
130+
for (int x : arr1) {
131+
auto i = lower_bound(arr2.begin(), arr2.end(), x);
132+
auto j = lower_bound(arr3.begin(), arr3.end(), x);
133+
if (*i == x && *j == x) {
134+
ans.push_back(x);
116135
}
117136
}
118-
return arr[left] == val;
137+
return ans;
119138
}
120139
};
121140
```
122141

123142
### **Go**
124143

125144
```go
126-
func arraysIntersection(arr1 []int, arr2 []int, arr3 []int) []int {
127-
var res []int
128-
for _, num := range arr1 {
129-
if find(arr2, num) && find(arr3, num) {
130-
res = append(res, num)
145+
func arraysIntersection(arr1 []int, arr2 []int, arr3 []int) (ans []int) {
146+
cnt := [2001]int{}
147+
for _, x := range arr1 {
148+
cnt[x]++
149+
}
150+
for _, x := range arr2 {
151+
cnt[x]++
152+
}
153+
for _, x := range arr3 {
154+
cnt[x]++
155+
if cnt[x] == 3 {
156+
ans = append(ans, x)
131157
}
132158
}
133-
return res
159+
return
134160
}
161+
```
135162

136-
func find(arr []int, val int) bool {
137-
left, right := 0, len(arr)-1
138-
for left < right {
139-
mid := (left + right) >> 1
140-
if arr[mid] >= val {
141-
right = mid
142-
} else {
143-
left = mid + 1
163+
```go
164+
func arraysIntersection(arr1 []int, arr2 []int, arr3 []int) (ans []int) {
165+
for _, x := range arr1 {
166+
i := sort.SearchInts(arr2, x)
167+
j := sort.SearchInts(arr3, x)
168+
if i < len(arr2) && j < len(arr3) && arr2[i] == x && arr3[j] == x {
169+
ans = append(ans, x)
144170
}
145171
}
146-
return arr[left] == val
172+
return
147173
}
148174
```
149175

0 commit comments

Comments
 (0)