diff --git a/0162.Find-Peak-Element/memo.md b/0162.Find-Peak-Element/memo.md new file mode 100644 index 0000000..4b8b968 --- /dev/null +++ b/0162.Find-Peak-Element/memo.md @@ -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の解法を眺めたが新しいものはない。 diff --git a/0162.Find-Peak-Element/step1.py b/0162.Find-Peak-Element/step1.py new file mode 100644 index 0000000..b6e928a --- /dev/null +++ b/0162.Find-Peak-Element/step1.py @@ -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 diff --git a/0162.Find-Peak-Element/step1_bisect.py b/0162.Find-Peak-Element/step1_bisect.py new file mode 100644 index 0000000..644ea82 --- /dev/null +++ b/0162.Find-Peak-Element/step1_bisect.py @@ -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) diff --git a/0162.Find-Peak-Element/step1_brute_force.py b/0162.Find-Peak-Element/step1_brute_force.py new file mode 100644 index 0000000..6c72758 --- /dev/null +++ b/0162.Find-Peak-Element/step1_brute_force.py @@ -0,0 +1,3 @@ +class Solution: + def findPeakElement(self, nums: List[int]) -> int: + return nums.index(max(nums)) diff --git a/0162.Find-Peak-Element/step1_closed_open.py b/0162.Find-Peak-Element/step1_closed_open.py new file mode 100644 index 0000000..43b698b --- /dev/null +++ b/0162.Find-Peak-Element/step1_closed_open.py @@ -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