【优选算法】(第十一篇)

devtools/2024/10/9 11:24:23/

目录

⼭峰数组的峰顶(easy)

题目解析

讲解算法原理

编写代码

寻找峰值(medium)

题目解析

讲解算法原理

编写代码


⼭峰数组的峰顶(easy)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

符合下列属性的数组 arr 称为⼭脉数组:
• arr.length >= 3
• 存在 i(0 < i < arr.length - 1) 使得:
◦ arr[0] < arr[1] < ... arr[i-1] < arr[i]
◦ arr[i] > arr[i+1] > ... > arr[arr.length - 1]
给你由整数组成的⼭脉数组 arr ,返回任何满⾜ arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] 的下标 i 。
⽰例1:
输⼊: arr = [0,1,0]
输出: 1
⽰例2:
输⼊: arr = [0,2,1,0]
输出: 1
⽰例3:
输⼊: arr = [24,69,100,99,79,78,67,36,26,19]
输出: 2

讲解算法原理

解法⼀(暴⼒查找):
算法思路:
峰顶的特点:⽐两侧的元素都要⼤。
因此,我们可以遍历数组内的每⼀个元素,找到某⼀个元素⽐两边的元素⼤即可。

算法代码:
 

class Solution {
public:int peakIndexInMountainArray(vector<int>& arr) {int n = arr.size();// 遍历数组内每⼀个元素,直到找到峰顶for (int i = 1; i < n - 1; i++) // 峰顶满⾜的条件if (arr[i] > arr[i - 1] && arr[i] > arr[i + 1])return i; // 为了处理 oj 需要控制所有路径都有返回值return -1;}
};

解法⼆(⼆分查找):
算法思路:
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] && arr[i] > arr[i + 1] ,也就是
呈现下降趋势。
2. 因此,根据 mid 位置的信息,我们可以分为下⾯三种情况:
◦ 如果 mid 位置呈现上升趋势,说明我们接下来要在 [mid + 1, right] 区间继续搜索;◦ 如果 mid 位置呈现下降趋势,说明我们接下来要在 [left, mid - 1] 区间搜索;
◦ 如果 mid 位置就是⼭峰,直接返回结果。 

编写代码

c++算法代码:

class Solution
{
public:int peakIndexInMountainArray(vector<int>& arr) {int left = 1, right = arr.size() - 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;}
};

java算法代码:

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;}
}

寻找峰值(medium)

题目解析

1.题目解析:. - 力扣(LeetCode)

2.题目描述:

峰值元素是指其值严格⼤于左右相邻值的元素。
给你⼀个整数数组nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何⼀个峰值所在位置即可。
你可以假设nums[-1]=nums[n]=-∞。
你必须实现时间复杂度为O(logn)的算法来解决此问题。
⽰例1:
输⼊:nums=[1,2,3,1]
输出:2
解释:3是峰值元素,你的函数应该返回其索引2。
⽰例2:
输⼊:nums=[1,2,1,3,5,6,4]
输出:1或5
解释:你的函数可以返回索引1,其峰值元素为2;
或者返回索引5,其峰值元素为6。
提⽰:
1<=nums.length<=1000
-231<=nums[i]<=231-1
对于所有有效的i都有nums[i]!=nums[i+1]

讲解算法原理

解法⼆(⼆分查找算法):
算法思路:
寻找⼆段性:
任取⼀个点 i ,与下⼀个点 i + 1 ,会有如下两种情况:
• arr[i] > arr[i + 1] :此时「左侧区域」⼀定会存在⼭峰(因为最左侧是负⽆
穷),那么我们可以去左侧去寻找结果;
• arr[i] < arr[i + 1] :此时「右侧区域」⼀定会存在⼭峰(因为最右侧是负⽆
穷),那么我们可以去右侧去寻找结果。
当我们找到「⼆段性」的时候,就可以尝试⽤「⼆分查找」算法来解决问题。

编写代码

c++算法代码:

class Solution
{
public:int peakIndexInMountainArray(vector<int>& arr) {int left = 1, right = arr.size() - 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;}
};

java算法代码:
 

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;}
}


http://www.ppmy.cn/devtools/122390.html

相关文章

【CSS Tricks】试试新思路去处理文本超出情况

目录 引言一、常规套路1. 单行文本省略2. 多行文本省略 二、新思路美化一下1. 单行/多行文本隐藏2. 看下效果 三、总结 引言 本篇为css的一个小技巧 文本溢出问题是一个较为常见的场景。UI设计稿为了整体的美观度会将文本内容限制到一定范围内&#xff0c;然而UI设计阶段并不能…

GPT带我学-设计模式16-原型模式

概述 原型模式是一种创建型设计模式&#xff0c;它允许通过复制现有对象来创建新对象&#xff0c;而不是通过类的构造函数。这个模式特别适用于对象创建开销较大或者对象需要频繁被创建和销毁的场景。 主要组成部分&#xff1a; 原型接口&#xff1a;声明一个克隆自身的方法。…

项目定位与服务器(SERVER)模块划分

目录 定位 HTTP协议以及HTTP服务器 高并发服务器 单Reactor单线程 单Reactor多线程 多Reactor多线程 模块划分 SERVER模块划分 Buffer 模块 Socket模块 Channel 模块 Connection模块 Acceptor模块 TimerQueue模块 Poller模块 EventLoop模块 TcpServer模块 SE…

Windows11系统下Docker环境搭建教程

目录 前言Docker简介安装docker总结 前言 本文为博主在项目环境搭建时记录的Docker安装流程&#xff0c;希望对大家能够有所帮助&#xff0c;不足之处欢迎批评指正&#x1f91d;&#x1f91d;&#x1f91d; Docker简介 Docker 就像一个“容器”平台&#xff0c;可以帮你把应用…

Spring Cloud Netflix Eureka 注册中心讲解和案例示范

在微服务架构中&#xff0c;服务的发现和注册是至关重要的一环。Netflix Eureka 是一个在云端设计的服务注册与发现系统。它允许各个微服务将自身注册到注册中心&#xff0c;并在需要时发现其他服务&#xff0c;从而实现客户端负载均衡、服务容错以及动态扩展。本文将深入分析 …

登 Nature 子刊!论文一作详解蛋白质语言模型的小样本学习方法,解决湿实验数据匮乏难题

在「Meet AI4S」系列直播第三期中&#xff0c;我们有幸邀请到了上海交通大学自然科学研究院 & 上海国家应用数学中心博士后周子宜&#xff0c; 他所在的上海交通大学洪亮课题组研究方向主要为 AI 蛋白和药物设计、分子生物物理。该课题组研究成果颇丰&#xff0c;截止目前共…

YOLOv5改进:Unified-loU,用于高品质目标检测的统一loU ,2024年8月最新IoU

💡💡💡现有IoU问题点:IoU (Intersection over Union)作为模型训练的关键,极大地显示了当前预测框与Ground Truth框之间的差异。后续研究者不断在IoU中加入更多的考虑因素,如中心距离、纵横比等。然而,仅仅提炼几何差异是有上限的;而且新的对价指数与借据本身存在潜在…

微服务架构:核心组件解析与设计思考(服务发现、API网关、 配置中心、负载均衡、服务调用、服务熔断、链路追踪、消息队列、服务安全、分布式事务)

微服务架构已成为大型系统设计中不可忽视的趋势&#xff0c;它通过将单一系统拆分为多个自治的服务&#xff0c;解决了传统单体架构难以应对的复杂性和扩展性问题。然而&#xff0c;微服务架构的成功依赖于多个核心组件的协同工作&#xff0c;从服务发现到API网关&#xff0c;从…