灵茶山艾府【基础算法精讲 05】| 数组峰值 搜索旋转排序数组笔记(Python3)
·
原视频链接:数组峰值 搜索旋转排序数组【基础算法精讲 05】,博主:灵茶山艾府
下面都是用左闭右开区间来写的(因为我比较喜欢用左闭右开区间)
一、寻找峰值(162. 寻找峰值)
class Solution:
def findPeakElement(self, nums: List[int]) -> int:
# 本题用左闭右开区间来写:[0, n-1)
# 闭区间遍历:[0,n-2]
# 时间复杂度O(log n)
# 空间复杂度O(1)
left = 0
right = len(nums) - 1
while left < right:
mid = (left + right) // 2
if nums[mid] > nums[mid + 1]:
right = mid
else:
left = mid + 1
return left
二、寻找旋转排序数组中的最小值(153. 寻找旋转排序数组中的最小值)
class Solution:
def findMin(self, nums: List[int]) -> int:
# 本题用左闭右开区间来写:[0, n-1)
# 闭区间遍历:[0,n-2]
# 时间复杂度O(log n)
# 空间复杂度O(1)
left = 0
right = len(nums) - 1
while left < right:
mid = (left + right) // 2
if nums[mid] < nums[-1]: # 这部分不一样
right = mid
else:
left = mid + 1
return nums[right] # 这部分不一样
三、搜索旋转排序数组(33. 搜索旋转排序数组)
class Solution:
def search(self, nums: List[int], target: int) -> int:
def is_blue(i: int) -> bool:
end = nums[-1]
if nums[i] > end:
return target > end and nums[i] >= target
else:
return target > end or nums[i] >= target
left = 0
right = len(nums) - 1
while left < right:
mid = (left + right) // 2
if is_blue(mid):
right = mid
else:
left = mid + 1
if right == len(nums) or nums[right] != target:
return -1
return right
更多推荐


所有评论(0)