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 0162.Find-Peak-Element/memo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# 162. Find Peak Element

## step1
16mほどかかった。閉区間の二分探索。閉開区間で書くとindexのアクセスが範囲外となりうるため。
閉開区間でも書いておく。

制約が小さいのでbrute forceを使っても実行時間は変わらない。

答えが複数あるときに返る値は未確定。しかし、例えば小さい index を返すように制約を加えると二分探索では解けなくなるように思う。
mid, left, right の情報を見て区間の山を特定することができないため。

単調性がないので bisect の使用は不適切なはずだが、と動く。同じ二分探索のロジックで書かれているため。

https://github.com/python/cpython/blob/main/Lib/bisect.py

## step2

LeetCodeの解法を眺めたが新しいものはない。
12 changes: 12 additions & 0 deletions 0162.Find-Peak-Element/step1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
class Solution:
def findPeakElement(self, nums: list[int]) -> int:
left = 0
right = len(nums) - 1
while left < right:
mid = left + (right - left) // 2
if nums[mid] < nums[mid + 1]:
left = mid + 1
else:
right = mid

return left
9 changes: 9 additions & 0 deletions 0162.Find-Peak-Element/step1_bisect.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import bisect


class Solution:
def findPeakElement(self, nums: list[int]) -> int:
def is_decreasing(index):
return index == len(nums) - 1 or nums[index] > nums[index + 1]

return bisect.bisect_left(range(len(nums)), True, key=is_decreasing)
3 changes: 3 additions & 0 deletions 0162.Find-Peak-Element/step1_brute_force.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class Solution:
def findPeakElement(self, nums: List[int]) -> int:
return nums.index(max(nums))
12 changes: 12 additions & 0 deletions 0162.Find-Peak-Element/step1_closed_open.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
class Solution:
def findPeakElement(self, nums: list[int]) -> int:
left = 0
right = len(nums)
while left < right:
mid = left + (right - left) // 2
if mid < len(nums) and nums[mid] < nums[mid + 1]:
left = mid + 1
else:
right = mid

return left