diff --git a/arai60/intersection-of-two-arrays/README.md b/arai60/intersection-of-two-arrays/README.md new file mode 100644 index 0000000..5f52c7a --- /dev/null +++ b/arai60/intersection-of-two-arrays/README.md @@ -0,0 +1,38 @@ +## 考察 +- 過去に解いたことあり +- 方針 + - 積集合をとる(Pythonだと、setに変換して集合演算) + - time: O(n + m), space: O(n + m) + - n: len(nums1), m: len(nums2) + - 片方をHashSetにしてループ処理 + - 結果をユニークにして返す + - time: O(n + m), space: O(n + m) +- 直感的な積集合をとる方針でやる +- あとは実装 + +## Step1 +- 集合演算で実装 +- time: O(n + m), space: O(n + m) + +## Step2 +- ほかの人のPRを検索してみた +- sortしてtwo pointersを使う方法もあるみたい + - Ref. https://github.com/Mike0121/LeetCode/pull/30#discussion_r1641596790 + - そういえば昨日ちょうどソート済みの2つの配列のintersectionを活用する問題をやった + - https://leetcode.com/problems/get-the-maximum-score/description/ + - もともとソート済みならO(min(n, m))なので速い + - この手法でもやってみる +- この問題の場合は、ソートがボトルネックになる +- time: O(n log n + m log m), space: O(min(n, m)) + +## Step3 +- 1回目: 22s +- 2回目: 21s +- 3回目: 22s + +## Step4 +- レビューを元に修正 +- ワンライナーでも良さそうなので、一行で記述した +- two pointersの方も修正 + - `answer` -> `intersection` + - `list.sort()` を使ってもメモリO(n)のため、引数に破壊的変更を加えない形に修正 diff --git a/arai60/intersection-of-two-arrays/step1.py b/arai60/intersection-of-two-arrays/step1.py new file mode 100644 index 0000000..4994751 --- /dev/null +++ b/arai60/intersection-of-two-arrays/step1.py @@ -0,0 +1,5 @@ +class Solution: + def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]: + nums1_set = set(nums1) + nums2_set = set(nums2) + return list(nums1_set & nums2_set) diff --git a/arai60/intersection-of-two-arrays/step2.py b/arai60/intersection-of-two-arrays/step2.py new file mode 100644 index 0000000..6d83643 --- /dev/null +++ b/arai60/intersection-of-two-arrays/step2.py @@ -0,0 +1,24 @@ +class Solution: + def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]: + nums1.sort() + nums2.sort() + + index_nums1 = 0 + index_nums2 = 0 + answer = [] + while index_nums1 < len(nums1) and index_nums2 < len(nums2): + if nums1[index_nums1] < nums2[index_nums2]: + index_nums1 += 1 + continue + if nums1[index_nums1] > nums2[index_nums2]: + index_nums2 += 1 + continue + + common = nums1[index_nums1] + answer.append(common) + while index_nums1 < len(nums1) and nums1[index_nums1] == common: + index_nums1 += 1 + while index_nums2 < len(nums2) and nums2[index_nums2] == common: + index_nums2 += 1 + + return answer diff --git a/arai60/intersection-of-two-arrays/step3.py b/arai60/intersection-of-two-arrays/step3.py new file mode 100644 index 0000000..4994751 --- /dev/null +++ b/arai60/intersection-of-two-arrays/step3.py @@ -0,0 +1,5 @@ +class Solution: + def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]: + nums1_set = set(nums1) + nums2_set = set(nums2) + return list(nums1_set & nums2_set) diff --git a/arai60/intersection-of-two-arrays/step4.py b/arai60/intersection-of-two-arrays/step4.py new file mode 100644 index 0000000..f66d82c --- /dev/null +++ b/arai60/intersection-of-two-arrays/step4.py @@ -0,0 +1,3 @@ +class Solution: + def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]: + return list(set(nums1) & set(nums2)) diff --git a/arai60/intersection-of-two-arrays/step4_two_pointers.py b/arai60/intersection-of-two-arrays/step4_two_pointers.py new file mode 100644 index 0000000..0d883e8 --- /dev/null +++ b/arai60/intersection-of-two-arrays/step4_two_pointers.py @@ -0,0 +1,24 @@ +class Solution: + def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]: + nums1_sorted = sorted(nums1) + nums2_sorted = sorted(nums2) + + index_nums1 = 0 + index_nums2 = 0 + intersection = [] + while index_nums1 < len(nums1_sorted) and index_nums2 < len(nums2_sorted): + if nums1_sorted[index_nums1] < nums2_sorted[index_nums2]: + index_nums1 += 1 + continue + if nums1_sorted[index_nums1] > nums2_sorted[index_nums2]: + index_nums2 += 1 + continue + + common = nums1_sorted[index_nums1] + intersection.append(common) + while index_nums1 < len(nums1_sorted) and nums1_sorted[index_nums1] == common: + index_nums1 += 1 + while index_nums2 < len(nums2_sorted) and nums2_sorted[index_nums2] == common: + index_nums2 += 1 + + return intersection