《算法题讲解指南:优选算法-二分查找》--21.山峰数组的的峰顶索引,22.寻找峰值

《算法题讲解指南:优选算法-二分查找》--21.山峰数组的的峰顶索引,22.寻找峰值

🔥小叶-duck个人主页

❄️个人专栏《Data-Structure-Learning》

《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

21. 山峰数组的的峰顶索引

题目链接:

题目描述:

题目示例:

解法(二分查找):

算法思路:

C++算法代码:

算法总结及流程解析:

22. 寻找峰值

题目链接:

题目描述:

题目示例:

解法(二分查找):

算法思路:

C++算法代码:

算法总结及流程解析:

结束语


21. 山峰数组的的峰顶索引

题目链接:

852. 山脉数组的峰顶索引 - 力扣(LeetCode)

题目描述:

题目示例:

解法(二分查找):

算法思路:

      分析峰顶位置的数据特点,以及山峰两旁的数据的特点:

  • 峰顶数据特点:arr[ i ]>arr[ i - 1 ] && arr[ i ]>arr[ i + 1 ]
  • 峰顶左边的数据特点:arr[ i ] > arr[ i - 1 ] && arr[ i ] < arr[ i + 1 ],也就是呈上升趋势
  • 峰顶右边数据的特点:arr[ i ] < arr[ i - 1 ] && arr[ i ] > arr[ i + 1 ],也就是呈下降趋势

      因此,我们可以分为以下两种情况:

  • 如果 mid 位置的值小于 mid-1 位置的值 left=mid;
  • 如果 mid 位置的值大于 mid-1 位置的值 right=mid-1;

C++算法代码:

class Solution { public: int peakIndexInMountainArray(vector<int>& arr) { //区间划分:[ 小于峰值 ], [ 大于等于峰值 ](相当于查找左端点) // int left = 0; int right = arr.size(); // while(left < right) // { // int mid = left + (right - left) / 2; // //对于偶数而言mid始终是在左边,所以判断条件是arr[mid] < arr[mid + 1] // if(arr[mid] < arr[mid + 1]) // { // left = mid + 1; // } // else // { // right = mid; // } // } // return left; //区间划分:[ 小于等于峰值 ], [ 大于峰值 ](相当于查找右端点) int left = 0; int right = arr.size(); while(left < right) { int mid = left + (right - left + 1) / 2; //对于偶数而言mid始终是在右边,所以判断条件是arr[mid - 1] < arr[mid] if(arr[mid - 1] < arr[mid]) { left = mid; } else { right = mid - 1; } } return left; } };

算法总结及流程解析:

22. 寻找峰值

题目链接:

162. 寻找峰值 - 力扣(LeetCode)

题目描述:

题目示例:

解法(二分查找):

算法思路:

      寻找二段性:任取一个点 i,与下一个点 i+1,会有如下两种情况:

  • arr[ i ] > arr[ i + 1 ]:此时【左侧区域】一定会存在山峰(因为最左侧是负无穷),那么我们就可以去左侧寻找结果
  • arr[ i ] < arr[ i + 1 ]:此时【右侧区域】一定会存在山峰(因为最右侧是负无穷),那么我们就可以去右侧寻找结果

      当我们找到【二段性】的时候,就可以尝试用【二分查找】算法来解决问题。

C++算法代码:

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

算法总结及流程解析:

结束语

      到此,21.山峰数组的的峰顶索引,22.寻找峰值 这两道算法题就讲解完了。以题带点,详细分析了山峰数组的特性:峰顶同时大于左右相邻值,左侧呈上升趋势,右侧呈下降趋势。解题时抓住"二段性"特征,通过比较中间值与相邻元素的关系,逐步缩小搜索范围。希望大家能有所收获!

Read more

AIGC时代的必备技能:提示词工程(Prompt Engineering)全面指南

AIGC时代的必备技能:提示词工程(Prompt Engineering)全面指南

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为ZEEKLOG博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理解,而且能够帮助新手快速入门。 本文主要介绍了AIGC时代的必备技能:提示词工程(Prompt Engineering)全面指南,可点击学习完整版视频课程,希望对学习大语言模型的同学们有所帮助。 文章目录 * 一、提示词的基本概念 * 1.1 什么是提示词? * 1.2 提示词的功能特性 * 1.3 提示工程的重要性 * 二、提示词的基本构成要素 * 2.1 提示词是一门学习引导AI思考的艺术 * 2.2 四大核心组成部分 * 2.2.1 指令(Instruction) * 2.2.2 上下文(

By Ne0inhk

Whisper.cpp CUDA加速性能突破:从理论瓶颈到实践超越的技术重构

Whisper.cpp CUDA加速性能突破:从理论瓶颈到实践超越的技术重构 【免费下载链接】whisper.cppOpenAI 的 Whisper 模型在 C/C++ 中的移植版本。 项目地址: https://gitcode.com/GitHub_Trending/wh/whisper.cpp 当语音识别技术遇上实时性挑战,传统CPU计算往往成为性能瓶颈。面对长音频处理、多语言并发、低延迟响应等严苛需求,开发者如何突破计算限制?本文将带你深入探索whisper.cpp结合CUDA的完整技术重构路径。 问题诊断:为什么CPU无法满足现代语音识别需求? 在深入优化方案前,我们首先需要理解问题的本质。语音识别任务涉及复杂的神经网络计算,特别是注意力机制和Transformer架构,这些计算在CPU上执行时面临三大核心挑战: 计算密度不匹配:语音识别模型包含大量矩阵乘法运算,这些运算在CPU上只能顺序执行,而GPU的并行架构天然适合此类任务。 内存带宽限制:模型权重和中间结果在CPU和内存间频繁传输,而GPU的显存带宽远超系统内存。 实时处理瓶颈:在会议转录、直播字幕等场景

By Ne0inhk
GitHub Copilot 学生认证详细教程

GitHub Copilot 学生认证详细教程

GitHub Copilot 是 GitHub 提供的 AI 代码助手工具,学生可以通过 GitHub Student Developer Pack(学生开发者包)免费获取 Copilot Pro 版本(通常每月收费 10 美元)。这个过程涉及验证你的学生身份,一旦通过,你可以免费使用 Copilot Pro,直到你的学生身份到期(通常每年需要重新验证)。以下是最详细的教程,基于 GitHub 官方文档和社区指南,涵盖从准备到激活的所有步骤。我会逐步分解,确保每个步骤都清晰、可操作。如果你是第一次申请,预计整个过程可能需要 1-3 天(验证通常在 72 小时内完成)。 第一部分:资格要求和准备工作 在开始前,确保你符合条件。如果不符合,申请会被拒绝。 * 资格标准: * 你必须是当前在读学生,

By Ne0inhk
AIGC已经不是未来,而是现在:2025年最值得关注的6大趋势!

AIGC已经不是未来,而是现在:2025年最值得关注的6大趋势!

过去一年,AIGC(AI 生成内容)从“概念”彻底走向“落地”。无论你是程序员、产品经理、内容创作者,甚至是业余爱好者,AIGC 已经渗透到每一个内容生产链条中,以一种“你还没准备好,它已经来了”的节奏迅速发展。 本文将带你系统了解:2025 年最热门的 AIGC 内容形态、前沿产品、典型用例,以及未来趋势。 🎥 1. 文生视频已落地:Sora 等产品引爆创意革命         当 OpenAI 推出 Sora 时,整个 AI 圈都沸腾了。         只需一句提示词,比如: "一个穿太空服的熊猫在月球上弹钢琴"         Sora 就能输出秒级电影级视频片段。光影、动作、镜头感,全部一应俱全。 🔧 技术关键词:

By Ne0inhk