分别为33、81、153、154、面试题11(最后两题相同).
1、搜索旋转排序数组
题目描述:
题解
异或骚操作
双指针法
class Solution:
def search(self, nums: List[int], target: int) -> int:
low,high = 0,len(nums) -1
while low < high:
mid = (low + high) // 2
if (nums[0] > target) ^ (nums[0] > nums[mid]) ^(target > nums[mid]):#有一个为真或都为真,结果为真
low = mid +1
else:
high = mid
return low if low ==high and nums[low] == target else -1
一般的:
class Solution:
def search(self, nums: List[int], target: int) -> int:
if not nums or len(nums) == 0:#判断特殊情况
return -1
low ,high = 0 ,len(nums) - 1
while low <= high:
mid = (high + low) // 2
if nums[mid] == target:#找到返回
return mid
continue
if nums[mid] >= nums[low]:#在[low,mid]升序
if nums[low] <= target < nums[mid]:#在[low,mid]查找
high = mid -1
else:
low = mid +1
else: #在[mid,high]升序
if nums[mid] < target <= nums[high]:#在[mid,high]查找
low = mid + 1
else:
high = mid - 1
return -1
2、搜索旋转排序数组 II
题目描述:
题解:
class Solution:
def search(self, nums: List[int], target: int) -> bool:
if not nums or len(nums) == 0:
return False
start,end = 0,len(nums) -1
mid = 0
while start <= end:
mid =start + (end - start) // 2
if nums[mid] == target:
return True
if nums[start] == nums[mid]:#比题目1多了一个判断重复的操作,重复就往右移动
start += 1
# end -= 1
continue
if nums[start] < nums[mid]:
if nums[mid] > target and nums[start] <= target:
end = mid - 1
else:
start = mid +1
else:
if nums[mid] < target and nums[end] >= target:
start = mid + 1
else:
end = mid -1
return False
3、寻找旋转排序数组中的最小值
题目描述:
题解:
class Solution:
def findMin(self, nums: List[int]) -> int:
#二分查找
low, high = 0, len(nums) - 1
while low < high:
mid = (low + high) // 2
if nums[mid] > nums[high]: low = mid + 1 #与最后一个判断,说明min在mid右边
elif nums[mid] < nums[high]: high = mid #与最后一个判断,说明min在mid左边
else: high -= 1 #去重
return nums[low]
或者:
class Solution:
def findMin(self, nums: List[int]) -> int:
low,high = 0,len(nums) -1
while low <= high:
mid = (low + high) // 2
if nums[low] <= nums[high]:#返回条件,说明没有反转,整体升序,返回第一个值
return nums[low]
if nums[low] <= nums[mid]:#[low,mid]升序,说明min在右边
low = mid + 1
else: #说明min在[low,mid]里
high = mid
return -1
4、寻找旋转排序数组中的最小值 II
题目描述:
题解:
class Solution:
def findMin(self, nums: List[int]) -> int:
#二分查找
low, high = 0, len(nums) - 1
while low < high:
mid = (low + high) // 2
if nums[mid] > nums[high]: low = mid + 1 #与最后一个判断,说明min在mid右边
elif nums[mid] < nums[high]: high = mid #与最后一个判断,说明min在mid左边
else: high -= 1 #去重
return nums[low]
或者
class Solution:
def findMin(self, nums: List[int]) -> int:
low ,high = 0,len(nums) - 1
while low <= high:
mid = (low + high) // 2
if nums[low] < nums[high] or low == high:#返回条件
return nums[low]
if nums[low] < nums[mid]:#[low,mid]升序,说明min在右边
low = mid +1
elif nums[low] == nums[mid]:#去重
low += 1
else: #说明min在[low,mid]里
high = mid
return -1