Skip to content

Commit 3a4d16b

Browse files
authored
Merge pull request #27 from colorbox/349
349. Intersection of Two Arrays
2 parents 1598c59 + cc471c2 commit 3a4d16b

File tree

7 files changed

+169
-0
lines changed

7 files changed

+169
-0
lines changed

349/step1.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
Time: 8:40
3+
4+
Time: O(N log N + M log M)
5+
Space: O(N + M)
6+
7+
nums1.size() == N
8+
nums2.size() == M
9+
*/
10+
class Solution {
11+
public:
12+
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
13+
set<int> nums1_set;
14+
for (int num : nums1) {
15+
if (nums1_set.find(num) != nums1_set.end()) {
16+
continue;
17+
}
18+
nums1_set.insert(num);
19+
}
20+
set<int> intersection;
21+
for (int num : nums2) {
22+
if (nums1_set.find(num) == nums1_set.end()) {
23+
continue;
24+
}
25+
if (intersection.find(num) != intersection.end()) {
26+
continue;
27+
}
28+
if (nums1_set.find(num) != nums1_set.end()) {
29+
intersection.insert(num);
30+
}
31+
}
32+
33+
vector<int> answer;
34+
for (int num : intersection) {
35+
answer.emplace_back(num);
36+
}
37+
38+
return answer;
39+
}
40+
};

349/step2_1.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
mapで書き直したパターン
3+
単一のmapでカウントできるのでsetを利用するstep1よりもシンプルになった
4+
Time: O(N + M)
5+
Space:
6+
*/
7+
class Solution {
8+
public:
9+
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
10+
map<int, int> nums_count;
11+
for (int num : nums1) {
12+
if (nums_count[num] == 1) {
13+
continue;
14+
}
15+
nums_count[num]++;
16+
}
17+
for (int num : nums2) {
18+
if (nums_count[num] != 1) {
19+
continue;
20+
}
21+
nums_count[num]++;
22+
}
23+
vector<int> intersected_nums;
24+
for (auto [num, count] : nums_count) {
25+
if (count == 2) {
26+
intersected_nums.push_back(num);
27+
}
28+
}
29+
return intersected_nums;
30+
}
31+
};

349/step2_1_fix.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public:
3+
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
4+
map<int, int> num_to_count;
5+
for (int num : nums1) {
6+
num_to_count[num]++;
7+
}
8+
vector<int> intersected_nums;
9+
for(int num : nums2) {
10+
if (num_to_count[num] > 0) {
11+
intersected_nums.push_back(num);
12+
num_to_count[num] = 0;
13+
}
14+
}
15+
return intersected_nums;
16+
}
17+
};

349/step2_2.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
Time: O(N log N + M log M)
3+
Space: O(N + M)
4+
5+
nums1.size() == N
6+
nums2.size() == M
7+
8+
2つのnumsをソートしてマージソートっぽくする手法
9+
https://github.com/gcc-mirror/gcc/blob/8762bb1b004c442b8dbb22a6d9eb0b7da4a3e59f/libstdc%2B%2B-v3/include/bits/stl_algo.h#L5208-L5230
10+
*/
11+
class Solution {
12+
public:
13+
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
14+
sort(nums1.begin(), nums1.end());
15+
sort(nums2.begin(), nums2.end());
16+
vector<int> intersected_nums;
17+
int i = 0, j = 0;
18+
while (i < nums1.size() && j < nums2.size()) {
19+
if (nums1[i] < nums2[j]) {
20+
i++;
21+
} else if (nums2[j] < nums1[i]) {
22+
j++;
23+
} else {
24+
if (intersected_nums.empty() || intersected_nums.back() != nums1[i]) {
25+
intersected_nums.push_back(nums1[i]);
26+
}
27+
i++;
28+
j++;
29+
}
30+
}
31+
return intersected_nums;
32+
}
33+
};

349/step2_3.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
`std::set_intersection`を使うパターン
3+
4+
Time : O(N log N + M log M)
5+
Space: O(N + M)
6+
7+
nums1.size() == N
8+
nums2.size() == M
9+
*/
10+
class Solution {
11+
public:
12+
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
13+
sort(nums1.begin(), nums1.end());
14+
sort(nums2.begin(), nums2.end());
15+
vector<int> intersected_nums;
16+
set_intersection(nums1.begin(), nums1.end(), nums2.begin(), nums2.end(), inserter(intersected_nums, intersected_nums.end()));
17+
auto it = unique(intersected_nums.begin(), intersected_nums.end());
18+
intersected_nums.erase(it, intersected_nums.end());
19+
return intersected_nums;
20+
}
21+
};

349/step2_3_fix.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class Solution {
2+
public:
3+
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
4+
set<int> set1(nums1.begin(), nums1.end());
5+
set<int> set2(nums2.begin(), nums2.end());
6+
vector<int> intersected_nums;
7+
std::set_intersection(set1.begin(), set1.end(), set2.begin(), set2.end(), std::inserter(intersected_nums, intersected_nums.end()));
8+
return intersected_nums;
9+
}
10+
};

349/step3.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public:
3+
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
4+
set<int> unique_nums;
5+
for (int num : nums1) {
6+
unique_nums.insert(num);
7+
}
8+
vector<int> intersected_nums;
9+
for (int num : nums2) {
10+
if (unique_nums.contains(num)) {
11+
intersected_nums.push_back(num);
12+
unique_nums.erase(num);
13+
}
14+
}
15+
return intersected_nums;
16+
}
17+
};

0 commit comments

Comments
 (0)