二分查找经典竞赛题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二分查找经典竞赛题
二分查找(Binary Search)是一种非常经典的算法,用于在有序数组中查找目标值。
在竞赛中,经常出现一些需要使用二分查找来解决的题目,本文将介绍一道典型的二分查找竞赛题目。
题目描述:
给定一个长度为 n 的有序数组,该数组中可能有重复元素。
你需要实现一个函数判断一个指定的数是否在这个数组中出现过,并返回它在数组中第一次出现的位置。
输入:nums(给定的长度为 n 的有序数组),target(需要查找的目标数)
输出:目标数在数组中第一次出现的位置(如果不存在则返回 -1)
例如:
输入:nums = [1, 2, 2, 3, 4, 5], target = 2
输出:1
输入:nums = [1, 2, 2, 3, 4, 5], target = 6
输出:-1
解题思路:
本题可以使用二分查找来解决,关键在于如何处理重复元素。
首先在二分查找时,我们依然按照传统二分查找的模板来处理,记录左端点 left 和右端点 right。
每次循环将数组中间位置 mid 的值与目标数比较,如果相等则返回 mid,否则根据大小关系更新 left 或 right 的值。
由于数组中可能存在重复元素,当 mid 的值等于目标数时,我们不能立即返回,因为该位置不一定是第一次出现的位置。
我们需要继续向左或右查找,直到找到第一次出现的位置。
具体来说,我们继续用二分查找模板处理,如果右一位的值不等于目标数,则 mid 就是第一次出现的位置;否则,继续向左查找,直到找到第一个不等于目标数的位置。
代码实现:
Python 3 代码如下:
def binary_search(nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] == target:
# 找到 mid 后继续查找第一次出现的位置
while mid > 0 and nums[mid - 1] == target: mid -= 1
return mid
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
时间复杂度:O(log n),其中 n 是数组的长度。