题目描述
给定一个有序数组和一个目标值,使用二分查找算法找到该目标值在数组中的位置。如果目标值不存在于数组中,则返回-1。
思路
二分查找是一种高效的查找算法,适用于已排序的列表。其基本思想是每次将搜索区间减半,直到找到目标值或搜索区间为空。
-
初始化两个指针,
left和right,分别指向数组的第一个元素和最后一个元素。 -
计算中间位置
mid。 -
比较中间位置的元素与目标值:
- 如果相等,直接返回
mid。 - 如果中间位置的值小于目标值,则调整
left为mid + 1。 - 如果中间位置的值大于目标值,则调整
right为mid - 1。
- 如果相等,直接返回
-
重复步骤2至3,直至
left大于right时结束循环,表明未找到目标值。
图解
深色版本
[1, 2, 3, 4, 5, 6, 7, 8, 9]
left right
mid
代码详解 (Python)
python
深色版本
def binary_search(nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
知识总结
二分查找仅适用于有序序列。
- 有序性的重要性:二分查找算法依赖于数组或列表的有序性来高效地定位目标值。如果数据集无序,直接使用二分查找将无法得到正确的结果。
- 排序准备:在实际问题中,如果给定的数据集是无序的,首先需要对其进行排序处理。常见的排序算法有快速排序、归并排序等。需要注意的是,排序操作本身的时间复杂度至少为O(n log n),因此在考虑是否使用二分查找前,应评估排序成本是否值得。
时间复杂度为O(log n),非常高效。
- 对数级增长:随着数据规模n的增长,二分查找所需的最大比较次数以对数形式增加(具体来说是以2为底n的对数)。这意味着即使面对非常大的数据集,二分查找也能保持较快的速度。
- 对比其他搜索方法:与线性搜索相比,二分查找在大规模数据上具有显著优势。线性搜索的时间复杂度为O(n),对于大数据量而言效率较低。
学习计划
- 制定目标:设定每天解决一定数量的问题。
- 定期复习:每隔一段时间回顾做过的题目,巩固知识点。
- 错题本:记录错误答案及原因分析,加深理解。
- 多样化练习:尝试不同难度级别的题目,提高解决问题的能力。
工具运用
- 利用豆包MarsCode提供的AI反馈功能来检查自己的代码逻辑是否正确,并获取改进建议。
- 结合在线资源如LeetCode、GitHub上的开源项目等进行额外学习。
- 使用笔记软件整理学习过程中遇到的新概念和技术点,方便日后查阅。
通过这种方式,可以更系统地掌握编程技能,同时也能享受到学习的乐趣。希望这些建议能够帮助到正在入门阶段的同学!