前言
作者:小蜗牛向前冲
专栏:小蜗牛算法之路
专栏介绍:"蜗牛之道,攀登大厂高峰,让我们携手学习算法。在这个专栏中,将涵盖动态规划、贪心算法、回溯等高阶技巧,不定期为你奉上基础数据结构的精彩算法之旅。一同努力,追逐技术的星辰大海。"
目录
一、二分查找
二分查找是一种在有序数组中查找目标值的算法。它通过反复将待查找区间分成两部分并检查中间元素来进行查找,以缩小搜索范围,直到找到目标值或确定目标值不存在为止。这种算法的时间复杂度为 O(log n),其中 n 是数组的元素个数。
对于二分查找,我们简单的理解就是通过二段性,不断的排除不属于目标值的的算法。
而为什么我们不三分,四分呢?
尽管三分、四分等算法在某些特定情况下可能会有所优势,但由于二分查找已经被广泛证明为高效且简单的解决方案,因此通常情况下选择二分更为合适。(这里和数学期望有关就不和大家证明了)
二分算法看起来非常简单,但是他的细节是非常多,而且查看能力非常强大。
比如当我们要查找2^32(42亿多),如果我们要暴力查找就要查找42亿多次,但是二次就只要查找32次。
为了解决二分细节太多问题(特别是在处理复杂问题,对边界情况的处理)
二、二分的朴素模板
1、例题1
这里我们直接用力扣上的一道题目来引出:
给定一个
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提示:
- 你可以假设
nums
中的所有元素是不重复的。n
将在[1, 10000]
之间。nums
的每个元素都将在[-9999, 9999]
之间。
这里是非常经典的二分运用,在一个有序的数组中(有序就说明有二段性) ,让我们排查目标值target,暴力就不提了,那二分是如何解题的。