link: https://leetcode.com/problems/search-in-rotated-sorted-array/
題目限制
由於條件比較複雜,先討論各種情況。
class Solution:
def search(self, nums: List[int], target: int) -> int:
def feasible(mid):
# sorted array
if nums[0] <= nums[-1]:
return target <= nums[mid]
# rotated array
else:
if nums[0] <= target:
return target <= nums[mid] or nums[mid] < nums[0]
else:
return target <= nums[mid] < nums[0]
left, right = 0, len(nums) - 1
while left < right:
mid = left + (right - left) // 2
if feasible(mid):
right = mid
else:
left = mid + 1
if nums[left] == target:
return left
else:
return -1
簡化版如下。
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1
while left < right:
mid = left + (right - left) // 2
if nums[0] <= target <= nums[mid] or nums[mid] < nums[0] <= target or target <= nums[mid] < nums[0]:
right = mid
else:
left = mid + 1
return left if nums[left] == target else -1
討論區的想法很棒,把rotated過的部分視為inf和-inf,參考這篇。
leetcode
link: https://leetcode.com/problems/
Feb 9, 2024Difficulty: Easy link: https://leetcode.com/problems/linked-list-cycle/ 1. Hash table $O(n)$ runtime, $O(n)$ space 用set紀錄看過的node,如果有重複就代表有cycle。 python # Definition for singly-linked list. # class ListNode:
Dec 28, 2022Difficulty: Medium link: https://leetcode.com/problems/distribute-coins-in-binary-tree/ 1. DFS $O(N)$ runtime, $O(H)$ space 定義dfs函數,計算以node為root的subtree,扣掉每個child node需要的1枚硬幣後,總共會多(或少)幾枚硬幣。 如果硬幣有多,回傳值就是正的;如果硬幣有缺,回傳值就是負的;剛剛好不多不缺的情況,回傳值為0。 dfs函數顯示,node最少還需要幾枚硬幣(缺硬幣的情況),或著node至少要給出幾枚硬幣(多硬幣的情況),才能達成題目要求的硬幣分布。
Nov 26, 2022Difficulty: Medium link: https://leetcode.com/problems/permutations/ 1. Backtracking $O(n!)$ runtime, $O(n)$ space 需要列出所有排列數,可以用backtracking。用take紀錄有沒有拿過nums的第i個元素。 python class Solution: def permute(self, nums: List[int]) -> List[List[int]]:
Nov 26, 2022or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up