算法每日双题精讲 —— 二分查找(寻找旋转排序数组中的最小值,点名)

 🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 

别再犹豫了!快来订阅我们的算法每日双题精讲专栏,一起踏上算法学习的精彩之旅吧💪   


         在算法的学习之旅中,二分查找是一种高效且经典的算法,其应用场景广泛。今天我们将深入探讨如何运用二分查找来解决 “寻找旋转排序数组中的最小值” 以及趣味十足的 “点名” 问题。这两道题不仅能加深我们对二分查找的理解,还能锻炼我们在不同场景下灵活运用算法的能力。 


 目录

一、寻找旋转排序数组中的最小值

📖题目描述

🧠讲解算法原理

💻代码实现(以 C++ 为例)

复杂度分析

二、点名

📖题目描述

🧠讲解算法原理

💻代码实现(以 C++ 为例)

复杂度分析


一、寻找旋转排序数组中的最小值

题目链接👉【力扣】

📖题目描述

 

 

 

🧠讲解算法原理

对于这道题,我们可以利用二分查找来优化时间复杂度。

        初始化左指针 left 为 0,右指针 right 为数组长度减 1。在循环过程中,计算中间索引 mid = left + (right - left) / 2 。

比较 nums[mid] 与 nums[right] 的大小:

  • 如果 nums[mid] < nums[right] ,说明最小值在 mid 及其左边,因为 mid 到 right 这一段是有序的,最小值肯定不在这一段,所以将 right 更新为 mid 。
  • 如果 nums[mid] > nums[right] ,说明最小值在 mid 的右边,因为 mid 及其左边这一段是有序的,最小值不在这一段,所以将 left 更新为 mid + 1 。

当 left 等于 right 时,循环结束,此时 nums[left] 就是数组中的最小值。

 

💻代码实现(以 C++ 为例)

#include <iostream>
#include <vector>

using namespace std;

int findMin(vector<int>& nums) {
    int left = 0, right = nums.size() - 1;
    while (left < right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] < nums[right]) {
            right = mid;
        }
        else {
            left = mid + 1;
        }
    }
    return nums[left];
}

复杂度分析

 

  • 时间复杂度:每次循环都将搜索区间缩小一半,所以时间复杂度为 O(log n),其中 n 是数组的长度。相比遍历整个数组查找最小值的暴力解法(时间复杂度为 O(n)),效率大大提高。
  • 空间复杂度:只使用了常数级别的额外空间,即几个指针变量,所以空间复杂度为 O(1)

二、点名

 题目链接👉【力扣】

📖题目描述

 

 

 

🧠讲解算法原理

这道题同样可以借助二分查找来高效解决。

        初始化左指针 left 为 0,右指针 right 为名单长度减 1。

        在循环中,计算中间索引 mid = left + (right - left) / 2 。

比较中间位置的学生名字与老师点的名字:

  • 如果相同,直接返回 mid 。
  • 如果中间位置的名字小于老师点的名字,说明要找的名字在 mid 的右边,将 left 更新为 mid + 1 。
  • 如果中间位置的名字大于老师点的名字,说明要找的名字在 mid 的左边,将 right 更新为 mid - 1 。

当 left 大于 right 时,循环结束,说明名单中没有该学生,返回 -1 。

💻代码实现(以 C++ 为例)

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int rollCall(vector<string>& names, string target) {
    int left = 0, right = names.size() - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (names[mid] == target) {
            return mid;
        }
        else if (names[mid] < target) {
            left = mid + 1;
        }
        else {
            right = mid - 1;
        }
    }
    return -1;
}

复杂度分析

  • 时间复杂度:每次迭代都能将搜索区间缩小一半,时间复杂度为O(log n) ,其中 n是名单中学生的数量。相比逐个遍历名单查找学生的暴力解法(时间复杂度为 O(n)),效率大幅提升。
  • 空间复杂度:只使用了常数级别的额外空间,如几个指针变量,所以空间复杂度为 O(1)

        通过对这两道题目的学习,我们对二分查找算法的理解和应用能力又上了一个新台阶。在今后遇到类似问题时,要学会灵活运用二分查找来优化代码的时间复杂度。

如果大家在学习过程中有任何疑问或者想法,欢迎在评论区交流分享。后续我还会带来更多精彩的算法内容,记得关注哦!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/960309.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java中的依赖注入(可以不使用@Autowired注解)

一、Autowired Autowired 是 Spring 框架中一个非常重要的注解&#xff0c;用于实现依赖注入&#xff08;Dependency Injection, DI&#xff09;。它可以让 Spring 容器自动将符合条件的 Bean 注入到标注了该注解的字段、构造函数或方法中&#xff0c;从而简化了代码的编写&am…

Android开发,待办事项提醒App的设计与实现(个人中心页)

文章目录 1. 编写UI布局2. 实现逻辑3. 运行效果图3. 关于作者其它项目视频教程介绍 Android开发&#xff0c;待办事项提醒App的设计与实现&#xff1a; https://blog.csdn.net/jky_yihuangxing/article/details/145277956?spm1001.2014.3001.5501 1. 编写UI布局 fragment_mi…

分布式系统学习:小结

关于分布式系统的学习就暂时告一段落了&#xff0c;下面整理了个思维导图&#xff0c;只涉及分布式的一些相关概念&#xff0c;需要的可自取。后面准备写下关于AI编程相关的技术文章&#xff0c;毕竟要紧跟时代的脚步嘛 思维导图xmind文件下载地址&#xff1a;https://download…

Ansible自动化运维实战--复制模块和用户模块(3/8)

文章目录 一、复制模块&#xff08;copy&#xff09;1.1、功能1.2、常用参数1.3、示例1.4、注意事项 二、用户模块&#xff08;user&#xff09;2.1、功能2.2、常用参数2.3、示例 一、复制模块&#xff08;copy&#xff09; 1.1、功能 用于将本地文件复制到远程主机。可以指定…

深度解析iTransformer:维度倒置与高效注意力机制的结合

今天&#xff0c;我想和大家一起探讨一篇非常有意思的Paper——iTransformer。作为一种针对多变量时间序列预测的新型架构&#xff0c;iTransformer 引入了颠覆性的设计思路&#xff0c;特别是在维度倒置和高效自注意力机制上的创新&#xff0c;展现出了出色的性能和适应性。 …

蓝桥杯模拟算法:多项式输出

P1067 [NOIP2009 普及组] 多项式输出 - 洛谷 | 计算机科学教育新生态 这道题是一道模拟题&#xff0c;我们需要分情况讨论&#xff0c;我们需要做一下分类讨论 #include <iostream> #include <cstdlib> using namespace std;int main() {int n;cin >> n;for…

82,【6】BUUCTF WEB .[CISCN2019 华东南赛区]Double Secret

进入靶场 提到了secret&#xff0c;那就访问 既然这样&#xff0c;那就传参看能不能报错 这个页面证明是有用的 传参长一点就会报错&#xff0c;传什么内容无所谓 所以网站是flask框架写的 有一个颜色深一点&#xff0c;点开看看 rc4加密url编码 import base64 from urllib…

MySQL--》深度解析InnoDB引擎的存储与事务机制

目录 InnoDB架构 事务原理 MVCC InnoDB架构 从MySQL5.5版本开始默认使用InnoDB存储引擎&#xff0c;它擅长进行事务处理&#xff0c;具有崩溃恢复的特性&#xff0c;在日常开发中使用非常广泛&#xff0c;其逻辑存储结构图如下所示&#xff0c; 下面是InnoDB架构图&#xf…

第 25 场 蓝桥月赛

3.过年【算法赛】 - 蓝桥云课 问题描述 蓝桥村的村民们正准备迎接新年。他们计划宰杀 N 头猪&#xff0c;以庆祝一整年的辛勤劳作和丰收。每头猪的初始位置位于下标 xi​&#xff0c;所有 xi​ 均为偶数&#xff0c;保证没有两头猪初始位置相同。 当猪意识到人类打算宰杀它们…

Ubuntu20.04 深度学习环境配置(持续完善)

文章目录 常用的一些命令安装 Anaconda创建conda虚拟环境查看虚拟环境大小 安装显卡驱动安装CUDA安装cuDNN官方仓库安装 cuDNN安装 cuDNN 库验证 cuDNN 安装确认 CUDA 和 cuDNN 是否匹配&#xff1a; TensorRT下载 TensorRT安装 TensorRT 本地仓库配置 GPG 签名密钥安装 Tensor…

【PyTorch][chapter 29][李宏毅深度学习]Fine-tuning LLM

参考&#xff1a; https://www.youtube.com/watch?veC6Hd1hFvos 目录&#xff1a; 什么是 Fine-tune 为什么需要Fine-tuning 如何进行Fine-tune Fine-tuning- Supervised Fine-tuning 流程 Fine-tuning参数训练的常用方案 LORA 简介 示例代码 一 什么是 Fine-tune …

【python】python基于机器学习与数据分析的二手手机特性关联与分类预测(源码+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 python基于机器学习与数据分析的二手手机特性关联与…

【机器学习】深入探索SVM:支持向量机的原理与应用

目录 &#x1f354; SVM引入 1.1什么是SVM? 1.2支持向量机分类 1.3 线性可分、线性和非线性的区分 &#x1f354; 小结 学习目标 知道SVM的概念 &#x1f354; SVM引入 1.1什么是SVM? 看一个故事&#xff0c;故事是这样子的&#xff1a; 在很久以前的情人节&#xf…

WPF基础 | WPF 布局系统深度剖析:从 Grid 到 StackPanel

WPF基础 | WPF 布局系统深度剖析&#xff1a;从 Grid 到 StackPanel 一、前言二、Grid 布局&#xff1a;万能的布局王者2.1 Grid 布局基础&#xff1a;构建网格世界2.2 子元素定位与跨行列&#xff1a;布局的精细操控2.3 自适应布局&#xff1a;灵活应变的秘诀 三、StackPanel…

性能测试网络风险诊断有哪些?

目录 一、网络定位分析手段 二、sar命令 三、netstat命令 以下是几种常见的网络风险诊断方法 网络连通性检查 带宽与延迟测量 丢包率分析 网络拓扑结构审查 安全设备影响评估 协议层面上的优化 负载均衡器效能检验 云化服务架构下的特殊考量 系统应用之间的交换&am…

ios打包:uuid与udid

ios的uuid与udid混乱的网上信息 新人开发ios&#xff0c;发现uuid和udid在网上有很多帖子里是混淆的&#xff0c;比如百度下&#xff0c;就会说&#xff1a; 在iOS中使用UUID&#xff08;通用唯一识别码&#xff09;作为永久签名&#xff0c;通常是指生成一个唯一标识&#xf…

微服务学习-服务调用组件 OpenFeign 实战

1. OpenFeign 接口方法编写规范 1.1. 在编写 OpenFeign 接口方法时&#xff0c;需要遵循以下规范 1.1.1.1. 接口中的方法必须使用 RequestMapping、GetMapping、PostMapping 等注解声明 HTTP 请求的类型。 1.1.1.2. 方法的参数可以使用 RequestParam、RequestHeader、PathVa…

开源项目Umami网站统计MySQL8.0版本Docker+Linux安装部署教程

Umami是什么&#xff1f; Umami是一个开源项目&#xff0c;简单、快速、专注用户隐私的网站统计项目。 下面来介绍如何本地安装部署Umami项目&#xff0c;进行你的网站统计接入。特别对于首次使用docker的萌新有非常好的指导、参考和帮助作用。 Umami的github和docker镜像地…

研究 Day.js 及其在 Vue3 和 Vue 框架中的应用详解

前言 在前端开发中&#xff0c;日期和时间处理是一个常见需求。随着技术的发展&#xff0c;我们有了更多高效、灵活的日期库可供选择。Day.js 就是一个轻量级、易于使用的 JavaScript 日期库&#xff0c;其灵感来源于 Moment.js&#xff0c;但体积更小&#xff0c;速度更快。本…

python基础语法(3) -------- 学习笔记分享

目录: 1. 函数 1.1 语法格式 1.2 函数参数 1.3 函数返回值 1.4 变量的作用域 1.5 函数的执行过程 1.6 函数的链式调用 1.7 函数的嵌套调用 1.8 函数递归 1.9 参数默认值 1.10 函数的关键字传参 2. 列表和元组 2.1 列表和元组是啥 2.2 创建列表 2.3 访问下标 2.…