标签:数组,二分查找
1. 704——二分查找
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
代码:
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid + 1
elif nums[mid] > target:
right = mid - 1
return -1
2. 35——搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n)
的算法。
代码:
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid + 1
elif nums[mid] > target:
right = mid - 1
return left
给你一个按照非递减顺序排列的整数数组 nums
,和一个目标值 target
。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target
,返回 [-1, -1]
。你必须设计并实现时间复杂度为 O(log n)
的算法解决此问题。
代码:
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
def searchBegin(nums, target):
left = 0
right = len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] == target:
right = mid - 1
elif nums[mid] < target:
left = mid + 1
elif nums[mid] > target:
right = mid - 1
return left
def searchEnd(nums, target):
left = 0
right = len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] == target:
left = mid + 1
elif nums[mid] < target:
left = mid + 1
elif nums[mid] > target:
right = mid - 1
return right
if len(nums) == 0 or target not in nums:
return [-1,-1]
else:
return [searchBegin(nums, target),searchEnd(nums, target)]
4. 69——x的平方根
给你一个非负整数 x
,计算并返回 x
的算术平方根。由于返回类型是整数,结果只保留整数部分,小数部分将被舍去。注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5)
或者 x ** 0.5
。
代码:
class Solution:
def mySqrt(self, x: int) -> int:
left = 0
right = x
while left <= right:
mid = left + (right - left) //2
if mid**2 == x:
return mid
elif mid**2 < x:
left = mid + 1
elif mid**2 > x:
right = mid - 1
return left - 1
给你一个正整数 num
。如果 num
是一个完全平方数,则返回 true
,否则返回 false
。完全平方数是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。不能使用任何内置的库函数,如 sqrt
。
代码:
class Solution:
def isPerfectSquare(self, num: int) -> bool:
left = 1
right = num
while left <= right:
mid = left + (right - left) // 2
if mid**2 == num:
return True
elif mid**2 < num:
left = mid + 1
elif mid**2 > num:
right = mid - 1
return False