参考:81. 搜索旋转排序数组 II - 力扣(LeetCode)
思路:
数组中有重复元素时,可能会影响二分查找的效果。通过判断 左右两边的值 是否相等,我们可以规避这种情况,调整搜索方向
参考代码:
def search(nums, target):left = 0right = len(nums) - 1while left <= right:mid = left + (right - left) // 2if nums[mid] == target:return mid# 处理重复元素# 由于该情况不能直接通过比较它们来判断当前区间的有序性。# 而是选择 缩小范围(通过 left += 1 和 right -= 1)来跳过重复元素,从而继续缩小搜索空间。# 如果我们不做任何处理,二分查找会陷入一个困境:它无法决定是向左还是向右搜索if nums[left] == nums[mid] == nums[right]:left += 1right -= 1elif nums[left] <= nums[mid]: # mid左侧有序if nums[left] <= target < nums[mid]: # 在左侧内right = mid - 1else: # 不在左侧内left = mid + 1else: # mid右侧有序if nums[mid] < target <= nums[right]:left = mid + 1else:right = mid - 1return -1nums = [1,1,3,1,1,1,1] # 还可以变题,重复元素中第一个出现target的index,现在还不满足;后续补充
# nums = [2,5,6,0,0,1,2]
target = 1
print(search(nums, target)) # 输出3(index)
ps:输出部分自己修改一下Boolean型就好了