Skip to content

Commit ecdf043

Browse files
committed
Add step1 ~ 3
1 parent 61a30f4 commit ecdf043

File tree

5 files changed

+128
-0
lines changed

5 files changed

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

349/step2_2.cpp

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

349/step2_3.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
3+
*/
4+
class Solution {
5+
public:
6+
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
7+
sort(nums1.begin(), nums1.end());
8+
sort(nums2.begin(), nums2.end());
9+
vector<int> intersected_nums;
10+
set_intersection(nums1.begin(), nums1.end(), nums2.begin(), nums2.end(), inserter(intersected_nums, intersected_nums.end()));
11+
auto it = unique(intersected_nums.begin(), intersected_nums.end());
12+
intersected_nums.erase(it, intersected_nums.end());
13+
return intersected_nums;
14+
}
15+
};

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)