【每日算法】查找算法1(中等)

简介: 查找算法(中等)

16fb98eea012ef0cb446588ddc50662.png

题目

剑指 Offer 11. 旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。

注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。

示例:

输入:numbers = [3,4,5,1,2]
输出:1
复制代码

分析

做这道题还是花了有点多时间的,踩坑无数,现在来一起复盘一下

首先这是一个半有序数组,可以优先考虑使用二分查找

之前有个误区,认为二分查找必须是有序数组才能使用,实际上只要满足一定的条件,就可以使用二分查找

二分查找本质是将查找区间由中间分为两份,只要能总结出,目标值在其中哪一部分,就可以使用二分查找

回到这道题中

需要我们分析出目标值在我们分割的区间中有什么特点

5770153093445a30cb6f415cbe2aa35.png

旋转点右侧元素大于旋转点左侧元素

如果使用二分法将数组切分,以 mid 为中点,把数组切成两部分

即 3 个端点:left = 0; right = numbers.length - 1; mid = (left + right) >> 1

[leff, mid)

[mid, right]

那么根据中间点 mid 的大小,会有三种情况

  • nums[mid] < nums[right]

最小值就在 [left, mid] 之间

  • nums[mid] > nums[right]

最小值就在 [mid, right]之间

  • 两者相等?

这个地方就有坑了,由于可能存在多个相同的值,无法直接确定就是最小值

这里就需要逐步逼近了,让右端点减1再继续迭代,这样最后的右端点就是我们所求的最小值

实现

function minArray(numbers: number[]): number {
    let l_idx: number = 0
    let r_idx: number = numbers.length - 1
    while(l_idx < r_idx) {
        const mid: number = (l_idx + r_idx) >> 1
        if (numbers[mid] < numbers[r_idx]) {
            // 【l_ridx - mid】
            r_idx = mid
        } 
        else if (numbers[mid] > numbers[r_idx]) {
            // 【mid - r_idx】
            l_idx = mid + 1
        }
        else {
            r_idx --
        }
    }
    return numbers[r_idx]
};
相关文章
|
人工智能 前端开发 Java
【Tomcat源码分析】启动过程深度解析 (二)
本文深入探讨了Tomcat启动Web应用的过程,重点解析了其加载ServletContextListener及Servlet的机制。文章从Bootstrap反射调用Catalina的start方法开始,逐步介绍了StandardServer、StandardService、StandardEngine、StandardHost、StandardContext和StandardWrapper的启动流程。每个组件通过Lifecycle接口协调启动,子容器逐层启动,直至整个服务器完全启动。此外,还详细分析了Pipeline及其Valve组件的作用,展示了Tomcat内部组件间的协作机制。
【Tomcat源码分析】启动过程深度解析 (二)
|
移动开发 Unix Linux
sed命令在Mac和Linux下的不同
sed命令在Mac和Linux下的不同
294 0
|
SQL 安全 网络安全
数字堡垒之下:网络安全漏洞与信息保护的现代战役
在数字化浪潮中,网络安全成为守护信息资产的关键战场。本文深入剖析网络漏洞的本质、加密技术的演进以及培养安全意识的重要性,旨在为读者提供一场关于如何在日益复杂的网络威胁面前保护个人和企业数据的知识盛宴。
108 0
|
消息中间件 前端开发 算法
交易所开发系统如何采用分布式架构(国王小组)
交易所开发系统如何采用分布式架构(国王小组)
交易所开发系统如何采用分布式架构(国王小组)
|
1天前
|
存储 JavaScript 前端开发
JavaScript基础
本节讲解JavaScript基础核心知识:涵盖值类型与引用类型区别、typeof检测类型及局限性、===与==差异及应用场景、内置函数与对象、原型链五规则、属性查找机制、instanceof原理,以及this指向和箭头函数中this的绑定时机。重点突出类型判断、原型继承与this机制,助力深入理解JS面向对象机制。(238字)
|
2天前
|
安全 数据可视化 网络安全
安全无小事|阿里云先知众测,为企业筑牢防线
专为企业打造的漏洞信息收集平台
1303 2
|
3天前
|
云安全 人工智能
2025,阿里云安全的“年度报告”
拥抱AI时代,阿里云安全为你护航~
1448 2
|
2天前
|
人工智能 自然语言处理 API
n8n:流程自动化、智能化利器
流程自动化助你在重复的业务流程中节省时间,可通过自然语言直接创建工作流啦。
337 4
n8n:流程自动化、智能化利器
|
10天前
|
机器学习/深度学习 安全 API
MAI-UI 开源:通用 GUI 智能体基座登顶 SOTA!
MAI-UI是通义实验室推出的全尺寸GUI智能体基座模型,原生集成用户交互、MCP工具调用与端云协同能力。支持跨App操作、模糊语义理解与主动提问澄清,通过大规模在线强化学习实现复杂任务自动化,在出行、办公等高频场景中表现卓越,已登顶ScreenSpot-Pro、MobileWorld等多项SOTA评测。
1429 7
|
21小时前
|
Linux 数据库
Linux 环境 Polardb-X 数据库 单机版 rpm 包 安装教程
本文介绍在CentOS 7.9环境下安装PolarDB-X单机版数据库的完整流程,涵盖系统环境准备、本地Yum源配置、RPM包安装、用户与目录初始化、依赖库解决、数据库启动及客户端连接等步骤,助您快速部署运行PolarDB-X。
214 1
Linux 环境 Polardb-X 数据库 单机版 rpm 包 安装教程