左闭右闭模式:
题目:
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
示例 1:
输入:nums
= [-1,0,3,5,9,12],target
= 9 输出: 4 解释: 9 出现在nums
中并且下标为 4
示例 2:
输入:nums
= [-1,0,3,5,9,12],target
= 2 输出: -1 解释: 2 不存在nums
中因此返回 -1
# 左闭右闭模式:
class Solution:
def search(self, nums, target):
left, right = 0, len(nums) - 1
while left <= right:
# 防止数字过大,越界
middle = left + (right - left) // 2
if nums[middle] > target:
right = middle - 1 # 因为是闭区间,所以-1,不减1的话,可能会死循环
elif nums[middle] < target:
left = middle + 1
else:
return middle
return -1
sol = Solution()
nums = list(map(int, input("请输入数字,以,分隔:").split(',')))
target = int(input("target = "))
result = sol.search(nums, target)
print(result)
例题2:
题目:35,搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n)
的算法。
代码:
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1
while left <= right:
middle = left + (right - left) // 2
if nums[middle] > target:
right = middle - 1
elif nums[middle] < target:
left = middle + 1
else:
return middle
# 与原本的二分查找法不一样的是:重点是返回了left.
return left