From 05d9a4666c83f8f9ebd9b455c621107f20d54585 Mon Sep 17 00:00:00 2001 From: kazukiii Date: Mon, 17 Jun 2024 16:55:38 -0700 Subject: [PATCH 1/3] =?UTF-8?q?step1,=20step2,=20step3=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arai60/intersection-of-two-arrays/README.md | 31 +++++++++++++++++++++ arai60/intersection-of-two-arrays/step1.py | 5 ++++ arai60/intersection-of-two-arrays/step2.py | 24 ++++++++++++++++ arai60/intersection-of-two-arrays/step3.py | 5 ++++ 4 files changed, 65 insertions(+) create mode 100644 arai60/intersection-of-two-arrays/README.md create mode 100644 arai60/intersection-of-two-arrays/step1.py create mode 100644 arai60/intersection-of-two-arrays/step2.py create mode 100644 arai60/intersection-of-two-arrays/step3.py diff --git a/arai60/intersection-of-two-arrays/README.md b/arai60/intersection-of-two-arrays/README.md new file mode 100644 index 0000000..78d7c8d --- /dev/null +++ b/arai60/intersection-of-two-arrays/README.md @@ -0,0 +1,31 @@ +## 考察 +- 過去に解いたことあり +- 方針 + - 積集合をとる(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 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) From 8a1e5af2eacdfda89e76d660982170c20b0fd530 Mon Sep 17 00:00:00 2001 From: kazukiii Date: Tue, 18 Jun 2024 13:56:40 -0700 Subject: [PATCH 2/3] =?UTF-8?q?step4=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arai60/intersection-of-two-arrays/README.md | 4 ++++ arai60/intersection-of-two-arrays/step4.py | 3 +++ 2 files changed, 7 insertions(+) create mode 100644 arai60/intersection-of-two-arrays/step4.py diff --git a/arai60/intersection-of-two-arrays/README.md b/arai60/intersection-of-two-arrays/README.md index 78d7c8d..97858ea 100644 --- a/arai60/intersection-of-two-arrays/README.md +++ b/arai60/intersection-of-two-arrays/README.md @@ -29,3 +29,7 @@ - 1回目: 22s - 2回目: 21s - 3回目: 22s + +## Step4 +- レビューを元に修正 +- ワンライナーでも良さそうなので、一行で記述した 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)) From 9796fd29b505a6e73311d3bf051377398d003a8c Mon Sep 17 00:00:00 2001 From: kazukiii Date: Tue, 18 Jun 2024 14:01:45 -0700 Subject: [PATCH 3/3] =?UTF-8?q?step4=E3=82=92=E8=BF=BD=E5=8A=A02?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arai60/intersection-of-two-arrays/README.md | 3 +++ .../step4_two_pointers.py | 24 +++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 arai60/intersection-of-two-arrays/step4_two_pointers.py diff --git a/arai60/intersection-of-two-arrays/README.md b/arai60/intersection-of-two-arrays/README.md index 97858ea..5f52c7a 100644 --- a/arai60/intersection-of-two-arrays/README.md +++ b/arai60/intersection-of-two-arrays/README.md @@ -33,3 +33,6 @@ ## Step4 - レビューを元に修正 - ワンライナーでも良さそうなので、一行で記述した +- two pointersの方も修正 + - `answer` -> `intersection` + - `list.sort()` を使ってもメモリO(n)のため、引数に破壊的変更を加えない形に修正 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