【面试高频算法解析】算法练习1 二分查找

目录

前言

本篇章开放目的是按算法类型学习算法,学习对应算法理论,并通过练习一些经典算法题深入理解这类算法,避免出现刷了很多算法题,还是一知半解的状态


算法解析

二分查找(Binary Search)是一种在有序数组中查找特定元素的高效算法。二分查找的基本思想是通过重复将待搜索的数据范围分成两半,并排除无关的一半,来缩小搜索的范围,直到找到目标值或确定目标值不存在为止。

二分查找的步骤如下:

  1. 确定搜索范围

    初始时,搜索范围是整个数组。

  2. 计算中点

    在当前的搜索范围内,计算中间位置的索引。通常的计算方法是 (low + high) / 2,其中 low 是搜索范围的开始索引,high 是结束索引。为了避免在索引非常大时导致整数溢出,推荐的做法是 low + (high - low) / 2

  3. 比较中点值与目标值

    将中点位置的数组值与目标值进行比较:

    • 如果中点值等于目标值,则查找成功,返回中点索引;
    • 如果中点值小于目标值,则目标值应在中点的右侧,将搜索范围调整为中点右侧的子数组;
    • 如果中点值大于目标值,则目标值应在中点的左侧,将搜索范围调整为中点左侧的子数组。
  4. 重复查找

    根据比较结果调整搜索范围,并在新的范围内重复步骤2和步骤3,直到找到目标值或搜索范围为空(即 low 超过 high),表明目标值不存在。

二分查找的时间复杂度为 O(log n),其中 n 是数组的长度。这使得二分查找比简单的线性查找(O(n))要快得多,尤其是在处理大数据集时。然而,二分查找的前提是数组已经是有序的。如果数组无序,需要先对数组进行排序,排序本身的时间成本可能会影响到整体的效率。

二分查找同时有递归和非递归(迭代)两种实现方式,具体选择哪一种取决于个人偏好和特定场景的需求。


练习题

二分查找

给定一个 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]之间。

复杂度分析

时间复杂度:O(log⁡n),其中 n 是数组的长度。

空间复杂度:O(1)。

官方题解


在排序数组中查找元素的第一个和最后一个位置

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 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]

提示:

0 <= nums.length <= 105

-109 <= nums[i] <= 109

nums 是一个非递减数组

-109 <= target <= 109

官方题解


搜索旋转排序数组

整数数组 nums 按升序排列,数组中的值 互不相同 。

在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2]。

给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入:nums = [4,5,6,7,0,1,2], target = 0

输出:4

示例 2:

输入:nums = [4,5,6,7,0,1,2], target = 3

输出:-1

示例 3:

输入:nums = [1], target = 0

输出:-1

提示:

1 <= nums.length <= 5000

-104 <= nums[i] <= 104

nums 中的每个值都 独一无二

题目数据保证 nums 在预先未知的某个下标上进行了旋转

-104 <= target <= 104

官方题解

相关推荐
passer__jw76711 分钟前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
Ocean☾17 分钟前
前端基础-html-注册界面
前端·算法·html
顶呱呱程序26 分钟前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
爱吃生蚝的于勒1 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~1 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
王哈哈^_^1 小时前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
星沁城1 小时前
240. 搜索二维矩阵 II
java·线性代数·算法·leetcode·矩阵
脉牛杂德2 小时前
多项式加法——C语言
数据结构·c++·算法
legend_jz2 小时前
STL--哈希
c++·算法·哈希算法
kingmax542120082 小时前
初三数学,最优解问题
算法