- 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -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
num = nums[mid]
if num == target:
return mid
elif num > target:
high = mid - 1
else:
low = mid + 1
return -1
- 第一个错误的版本 你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
class Solution:
def firstBadVersion(self, n):
"""
:type n: int
:rtype: int
"""
if isBadVersion(1):
return 1
left, right = 1, n
while left < right:
mid = (left + right) // 2
if not isBadVersion(mid) and isBadVersion(mid + 1):
return mid + 1
elif not isBadVersion(mid) and not isBadVersion(mid + 1):
left = mid + 1
elif isBadVersion(mid) and isBadVersion(mid + 1):
right = mid
- 搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
try:
index_value = nums.index(target)
return index_value
except:
length = len(nums)
for i in range(length):
if nums[i] > target and i > 0:
return i
if nums[i] > target and i == 0:
return 0
if nums[i] < target and i == length-1:
return length
二分法
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left,right = 0, len(nums)
if len(nums) == 0:
return 0
while left < right:
mid = (left + right) // 2
if nums[mid] == target:
return mid
if nums[mid] < target:
left = mid + 1
else:
right = mid
return left