Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions 033-search-in-rotated-array/memo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
## step1で考えたこと

前回の問題と似たように、L,R,Mを使って、幅を狭めていく、Targetと一致すればその地点のIndexをreturn
なければ return -1
ただ、今回のArrayもrotateされているから、シンプルに、nums[mid]とtargetを比較しても
分割したパーテーションに対象の値がなく、もう一方の方に存在する時にどうIndexを動かしていけば良いかがわからない。

## step2
Step1としては、
「左半分 or 右半分のどっちかは必ず昇順」
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

左半分も右半分もどちらも必ず照準に並んでいると思います。

「昇順側に target が入っているか範囲で見る」
という発想に到達できるとベストだった。

なぜ、普通の二分探索の方法が使えないのかを分析した上で、
左、右のどちらかはソートされていることに気づけていれば正解に近づけた気がする。

elif nums[mid] > nums[left]:
-> "="のつけ忘れ
16 changes: 16 additions & 0 deletions 033-search-in-rotated-array/step1.py
Original file line number Diff line number Diff line change
@@ -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
24 changes: 24 additions & 0 deletions 033-search-in-rotated-array/step2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
## 解答解説を見た後に自力で書いたコード

class Solution:
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

仮に自分がこの問題を解くとしたら、 nums[left] <= target < nums[mid] の部分の条件を頭の中で整理するのが難しいと感じるため、この条件文を避けようと考えると思います。避けるにあたり、最小値の左側の境界を見つけたあと、 target が左半分にあるか、右半分にあるかを確認し、それらの中で再度二分探索をするという、 2 段階のコードを書くと思います。

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]:
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

他の個所が < または <= で統一されているにもかかわらず、ここだけ > なのが気になりました。 < に統一するとよいと思います。

if nums[left] <= target < nums[mid]:
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

念のため確認させてください。 nums[left] <= target < nums[mid] の代わりに nums[left] <= target  とした場合、どのような問題が起きますか?また、 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
21 changes: 21 additions & 0 deletions 033-search-in-rotated-array/step3.py
Original file line number Diff line number Diff line change
@@ -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