From f565fc27888e926a2c0c2032c7cb3d78aa2e3f74 Mon Sep 17 00:00:00 2001 From: Rytxxx Date: Sun, 30 Nov 2025 18:42:42 -0800 Subject: [PATCH] 033-search-in-rotated-array --- 033-search-in-rotated-array/memo.md | 18 ++++++++++++++++++ 033-search-in-rotated-array/step1.py | 16 ++++++++++++++++ 033-search-in-rotated-array/step2.py | 24 ++++++++++++++++++++++++ 033-search-in-rotated-array/step3.py | 21 +++++++++++++++++++++ 4 files changed, 79 insertions(+) create mode 100644 033-search-in-rotated-array/memo.md create mode 100644 033-search-in-rotated-array/step1.py create mode 100644 033-search-in-rotated-array/step2.py create mode 100644 033-search-in-rotated-array/step3.py diff --git a/033-search-in-rotated-array/memo.md b/033-search-in-rotated-array/memo.md new file mode 100644 index 0000000..066cf75 --- /dev/null +++ b/033-search-in-rotated-array/memo.md @@ -0,0 +1,18 @@ +## step1で考えたこと + +前回の問題と似たように、L,R,Mを使って、幅を狭めていく、Targetと一致すればその地点のIndexをreturn +なければ return -1 +ただ、今回のArrayもrotateされているから、シンプルに、nums[mid]とtargetを比較しても +分割したパーテーションに対象の値がなく、もう一方の方に存在する時にどうIndexを動かしていけば良いかがわからない。 + +## step2 +Step1としては、 +「左半分 or 右半分のどっちかは必ず昇順」 +「昇順側に target が入っているか範囲で見る」 +という発想に到達できるとベストだった。 + +なぜ、普通の二分探索の方法が使えないのかを分析した上で、 +左、右のどちらかはソートされていることに気づけていれば正解に近づけた気がする。 + +elif nums[mid] > nums[left]: +-> "="のつけ忘れ \ No newline at end of file diff --git a/033-search-in-rotated-array/step1.py b/033-search-in-rotated-array/step1.py new file mode 100644 index 0000000..55f0701 --- /dev/null +++ b/033-search-in-rotated-array/step1.py @@ -0,0 +1,16 @@ +class Solution: + def search(self, nums: List[int], target: int) -> int: + left = 0 + right = len(nums) - 1 + + while left < right: + mid = (left + right) // 2 + + if nums[mid] == target: + return mid + elif nums[mid] > target: + + else: + + + return -1 \ No newline at end of file diff --git a/033-search-in-rotated-array/step2.py b/033-search-in-rotated-array/step2.py new file mode 100644 index 0000000..503d2f0 --- /dev/null +++ b/033-search-in-rotated-array/step2.py @@ -0,0 +1,24 @@ +## 解答解説を見た後に自力で書いたコード + +class Solution: + def search(self, nums: List[int], target: int) -> int: + left = 0 + right = len(nums) - 1 + + while left <= right: + mid = (left + right) // 2 + + if nums[mid] == target: + return mid + elif nums[mid] > nums[left]: + if nums[left] <= target < nums[mid]: + right = mid - 1 + else: + left = mid + 1 + else: + if nums[mid] < target <= nums[right]: + left = mid + 1 + else: + right = mid - 1 + + return -1 diff --git a/033-search-in-rotated-array/step3.py b/033-search-in-rotated-array/step3.py new file mode 100644 index 0000000..04cd581 --- /dev/null +++ b/033-search-in-rotated-array/step3.py @@ -0,0 +1,21 @@ +class Solution: + def search(self, nums: List[int], target: int) -> int: + left = 0 + right = len(nums) - 1 + + while left <= right: + mid = (left + right) // 2 + + if nums[mid] == target: + return mid + elif nums[left] <= nums[mid]: + if nums[left] <= target < nums[mid]: + right = mid - 1 + else: + left = mid + 1 + else: + if nums[mid] < target <= nums[right]: + left = mid + 1 + else: + right = mid - 1 + return -1