python面试题- 【二分法查找】给定一个已排序的非重复整数数组和一个目标值,如果找到目标,则返回索引。
前言
给定一个已排序的非重复整数数组和一个目标值,如果找到目标,则返回索引。如果不是,返回索引按顺序插入时的位置。
题目
给定一个已排序的非重复整数数组和一个目标值,如果找到目标,则返回索引。如果不是,返回索引按顺序插入时的位置。
(用二分法查找解决)
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
二分法查找
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,二分查找的时候一定要是有序的数组。
二分法思想
1.首先从数组的中间元素开始查找,如果该元素正好是目标元素,则搜索结束,否则执行下一步。
2.如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤1的操作。
3.如果某一步数组为空,则表示找不到目标元素
如下图,数组中有目标元素,查找21
如下图,数组中没有目标元素,查找70
直到 low > high 查找失败
python3 二分法查找
python3 代码示例
from typing import List
class Solution:
"""
二分法查找
"""
def searchInsert(self, nums: List[int], target: int) -> int:
low, high = 0, len(nums) - 1
while low <= high:
mid = low + (high-low) // 2
if nums[mid] == target:
return mid
elif nums[mid] < target:
low = mid + 1
else:
high = mid - 1
return low # 没找到则返回其位置左边的下标, 即为它按顺序插入的位置
if __name__ == '__main__':
res1 = Solution().searchInsert([1, 3, 5, 6], 5)
print(res1)
res2 = Solution().searchInsert([1, 3, 5, 6], 7)
print(res2)
以目标值为7示例
第一轮比较,mid 中间位置是数字3
target目标值7 大于中间数字3,所以第二轮比较
target目标值7 大于中间数字5,所以第三轮比较
由于第三轮比较target目标值7 大于中间数字6,此时low=mid=high了,依然满足while low <= high
,所以还会有下一轮比较
此时low = mid + 1
循环结束,最终返回左边的下标 low
参考博客https://blog.csdn.net/weixin_43511031/article/details/122494815
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2021-07-12 python测试开发django-107.form组件widgets(radio/checkbox/单选多选下拉框/日历控件)