刷题记录-数组
day1-二分查找
704. 二分查找
给定一个 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
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums)-1
while(left < right-1):
middle = (left + right) // 2
if nums[middle] == target:
return middle
elif nums[middle] < target:
left = middle
else:
right = middle
# 此时所有数组中的元素最多只有坐标left,right没有比较过,最后讨论他们的情况
if nums[left] == target:
return left
elif nums[right] == target:
return right
else:
return -1
相关题目
35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7
输出: 4
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/search-insert-position
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
相比于704,这次的分情况讨论要考虑3种情况
- target比nums[right]大 返回值是right+1
- target<=nums[left] 比如[1,3]1,或者[1,3],0 此时返回都是0,就是left
- 其他的情况就是target在(left, right],此时就是返回right。比如[1,3],2或者[1,3],3
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums)-1
while(left < right-1):
middle = (left+right)//2
if nums[middle] == target:
return middle
elif nums[middle] < target:
left = middle
else:
right = middle
if nums[right] < target:
return right + 1
elif nums[left] >= target:
return left
else:
return right
34. 在排序数组中查找元素的第一个和最后一个位置
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
来源:力扣(LeetCode) 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例 2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例 3:
输入:nums = [], target = 0
输出:[-1,-1]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分类讨论的过程中
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
result = [-1,-1]
if len(nums) == 0:
return result
# 找左面的第一个
left, right = 0, len(nums)-1
while (left < right-1):
middle = (right+ left)//2
if nums[middle] >= target:
right = middle # 因为是找最左面的,所以在相等的时候右指针移动
else:
left = middle
# 先用left比较
if nums[left] == target:
result[0] = left
elif nums[right] == target:
result[0] = right
else:
result[0] = -1
# 找右面的第一个
left, right = 0, len(nums)-1
while (left < right-1):
middle = (right+ left)//2
if nums[middle] <= target:
left = middle # 因为是找最右面的,所以在相等的时候左指针移动
else:
right = middle
# 先用right比较
if nums[right] == target:
result[1] = right
elif nums[left] == target:
result[1] = left
else:
result[1] = -1
return result
69. x 的平方根
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
来源:力扣(LeetCode) 链接:leetcode.cn/problems/sq… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例 1:
输入:x = 4
输出:2
示例 2:
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sqrtx
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution:
def mySqrt(self, x: int) -> int:
if x == 1:
return 1
if x == 0:
return 0
left , right = 1, x//2
while(left < right-1):
middle = (left+ right)//2
if middle ** 2 == x:
return middle
elif middle**2 < x:
left = middle
elif middle ** 2 > x:
right = middle
if right ** 2 <= x:
return right
return left