优选算法的折半之智:二分查找专题(二)

优选算法的折半之智:二分查找专题(二)

专栏:算法的魔法世界

个人主页:手握风云

目录

一、例题讲解

1.1. 山脉数组的峰顶索引

1.2. 寻找峰值

1.3. 寻找旋转排序数组中的最小值

1.4. 点名


一、例题讲解

1.1. 山脉数组的峰顶索引

        题目很简单,要求我们在数组中找出一个值,这个值要比它左右元素都大。利用折线表示如下图所示。

        我们先想一个暴力解法:利用一个指针去遍历一遍数组,如果某个元素比它的下一个元素大,那么返回这个元素的下标。我们最坏情况下要遍历到倒数第二个元素,所以时间复杂度为

O(n)

        从上图中我们已经可以看出,数组已经被分成两段,左边是递增的,右边是递减的,符合“二段性”,可以利用二分查找。如果arr[mid] > arr[mid-1],则left=mid(因为中间值可能就是我们要找的结果);如果arr[mid] < arr[mid-1],则right=mid-1。

        完整代码实现:

class Solution { public int peakIndexInMountainArray(int[] arr) { int left = 1,right = arr.length - 2; while(left < right){ int mid = left + (right - left + 1)/2; if(arr[mid] > arr[mid - 1]) left = mid; else right = mid - 1; } return left; } }

1.2. 寻找峰值

        与上一题不同的是,这道题的数组元素是上升、下降不断交替的。或者是递增的,或者是递减的。

        我们先来思考暴力解法:从第一个下标开始向后遍历,然后分情况讨论(如下图三种情况)。最坏情况下可能要走到最后一个元素,所以时间复杂度为

O(n)

        如果走到了数组的某个位置i,此时的nums[i] > nums[i+1],那么在i的左边的区间一定会存在一个峰值;相反,如果nums[i] < nums[i+1],那么在i的右边的区间一定会存在一个峰值。这样就会把数组分成了两个部分,取其中一个区间去查找,那么我们就可以用二分查找进行优化。

        完整代码实现:

class Solution { public int findPeakElement(int[] nums) { int left = 0, right = nums.length - 1; while (left < right) { int mid = left + (right - left) / 2; if (nums[mid] < nums[mid + 1]) left = mid + 1; else right = mid; } return left; } }

1.3. 寻找旋转排序数组中的最小值

        题目有点长,我们首先需要理解旋转的定义。每旋转一次,将数组中最大的元素移动至最前面(如下图所示)。

        暴力解法:从头到尾遍历一边数组,比较出里面的最小值,时间复杂度为

O(n)

        通过上面的示例1,我们可以很明显地发现“二段性”,左边是严格大于某个值的递增区间,右边是严格小于某个值递增区间,并且数组中没有重复元素,折线表示如下图所示。,我们以D点为参照物,“二段性”体现在AB区间是nums[i] > nums[i-1],CD区间是nums[i] < nums[i-1]。

        完整代码实现:

class Solution { public int findMin(int[] nums) { int left = 0, right = nums.length - 1; int x = nums[right];// 标记最后一个元素 while (left < right) { int mid = left + (right - left) / 2; if (nums[mid] > x) left = mid + 1; else right = mid; } return nums[left]; } }

1.4. 点名

        题目解析:在一个升序数组中找到唯一一个缺失的数字并返回这个数字。

        这道题可以有多种解法。1.哈希表:创建一个长度为n-1的哈希表,将数组元素放入,空出的位置就是丢失的数字。2.直接遍历数组,找出某个位置断掉的元素。3.位运算。利用0——n-1与数组里的元素进行按位异或操作,相同的数字就可以消去,最后剩下的数字就是缺失的数字。但这几种算法的时间复杂度都为

O(n)

        我们观察一下下图数组元素与下标的关系。在缺失的数字之前,数组元素与数组下标是一一对应的,到缺失的位置时,缺失的数字比数组元素小1。

        我们注意一个细节:如果给定的数组为[0,1,2,3],数组元素与下标都是一一对应的,而缺失的数字为最后一个元素加一。所以最后返回的时候,我们需要判断一下返回值的数组下标与数组元素是否相等。

        完整代码实现:

public class Solution { public int takeAttendance(int[] records) { int left = 0, right = records.length - 1; while (left < right) { int mid = left + (right - left) / 2; if (records[mid] == mid) left = mid + 1; else right = mid; } return records[left] == left ? left + 1 : left; } }

Read more

OpenClaw接入模型并基于WebUI完成智能操作

OpenClaw接入自定义模型并基于WebUI完成智能操作 背景介绍 OpenClaw(原 Clawdbot)是一个开源的 AI 代理框架,支持通过配置文件或 GUI 界面进行灵活配置。安装 OpenClaw 后,用户可以通过修改工作目录下的配置文件 openclaw.json 来接入不同的 LLM 模型提供商。 OpenClaw 支持众多主流模型提供商,包括 OpenAI、Anthropic、Moonshot AI(Kimi)、OpenRouter、Vercel AI Gateway、Amazon Bedrock 等。完整的提供商目录可参考官方文档 模型提供商快速入门。 要使用自定义的提供商,需要通过 models.providers 配置进行设置。这种方式允许用户接入官方支持列表之外的其他兼容 OpenAI API 或 Anthropic 格式的模型服务。 接入配置说明 核心配置参数解析

By Ne0inhk
2026 前端 / 后端 / 算法岗 AI 技能清单,直接对标大厂

2026 前端 / 后端 / 算法岗 AI 技能清单,直接对标大厂

2026 大厂前端岗 AI 技能清单 核心基础技能 * 大模型前端适配能力:掌握大模型上下文管理,实现对话历史的高效存储与加载,适配流式输出的前端渲染逻辑。 * AI 组件开发:熟练开发基于大模型的智能组件,如代码补全、智能问答、内容生成类组件,支持参数化配置与多模型切换。 * 向量数据库集成:掌握 Pinecone、Weaviate 等向量数据库的前端调用方法,实现语义搜索、相似内容推荐等功能。 进阶实践技能 * 大模型微调适配:理解大模型微调原理,能够基于前端业务场景,将微调后的模型部署至前端环境,实现模型轻量化调用。 * 多模态交互开发:支持文本、图像、音频等多模态输入的前端处理,对接多模态大模型 API 实现智能交互。 * AI 性能优化:实现大模型请求的批量处理、缓存复用与增量更新,降低前端请求延迟与资源消耗。 实战代码示例 以下为基于 OpenAI API 实现的流式对话前端组件,使用 React 18 开发:

By Ne0inhk
颠覆原型设计!Figma Make 实测:AI 真的能帮你写完前端吗?

颠覆原型设计!Figma Make 实测:AI 真的能帮你写完前端吗?

一、什么是 Figma Make? Figma Make 是 Figma 于 2025 年在 Config 大会上推出的 AI 驱动的 “Prompt‑to‑App” 工具,可将自然语言描述或现有 Figma 设计稿转换为可交互原型、网页或 Web App,而且支持通过聊天式界面进行迭代修改 (Figma, Figma学习中心)。 它基于 Anthropic 的 Claude 3.7 模型,能结合设计稿元数据生成代码,并允许逐元素编辑样式与交互逻辑 。 二、主要功能与用法亮点 * 对话式 AI 聊天界面:你可以直接“对话”让 AI 根据提示生成 UI,附加已有 Figma

By Ne0inhk
【前端实战】Axios 错误处理的设计与进阶封装,实现网络层面的数据与状态解耦

【前端实战】Axios 错误处理的设计与进阶封装,实现网络层面的数据与状态解耦

目录 【前端实战】Axios 错误处理的设计与进阶封装,实现网络层面的数据与状态解耦 一、为什么网络错误处理一定要下沉到 Axios 层 二、Axios 拦截器 interceptors 1、拦截器的基础应用 2、错误分级和策略映射的设计 3、错误对象标准化 三、结语         作者:watermelo37         ZEEKLOG优质创作者、华为云云享专家、阿里云专家博主、腾讯云“创作之星”特邀作者、火山KOL、支付宝合作作者,全平台博客昵称watermelo37。         一个假装是giser的coder,做不只专注于业务逻辑的前端工程师,Java、Docker、Python、LLM均有涉猎。 --------------------------------------------------------------------- 温柔地对待温柔的人,包容的三观就是最大的温柔。 --------------------------------------------------------------------- 【前

By Ne0inhk