【牛客算法】某司面试算法题:找出最长山脉的长度

文章目录

  • 一、题目
    • 1.1 题目描述
    • 1.2 示例1
    • 1.2 示例2
    • 1.3 提供的代码
  • 二、如何完成这个算法题?
    • 2.1 解题思路
      • 解释
      • 复杂度

一、题目

1.1 题目描述

给定一个长度为 n 的正整数数组,每个元素表示一座山的高度

其中满足以下条件的连续子数组称为山脉

  1. 长度大于等于3
  2. 存在下标 i ,满足 nums[0] < nums[1] < nums[2] < ... < nums[i]nums[i] > nums[i+1] > nums[i+2] ... > nums[i+k]
    请你找出最长山脉的长度

数据范围:

  • 1 ≤ n ≤ 10^5 , 数组中的元素满足 1<=nums[i] ≤ 10^4

1.2 示例1

输入

[2,5,2,1,5]

输出

4

说明

 [2,5,2,1] 

1.2 示例2

输入

[2,2,2,2,1]

输出

0

说明

没有山脉则输出 0 

1.3 提供的代码

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param nums int整型ArrayList * @return int整型*/public int longestmountain (ArrayList<Integer> nums) {// write code here}
}

二、如何完成这个算法题?

2.1 解题思路

这个题目可以通过遍历数组来解决,寻找满足条件的最长山脉

我们需要记录每座山脉的起点峰值终点,并计算最大长度

思路如下:

  1. 遍历数组:我们从第二个元素开始遍历,直到倒数第二个元素,因为山脉需要左右两侧各有一个递增递减部分。
  2. 寻找峰值:一个元素 nums[i] 是峰值,当它满足 nums[i - 1] < nums[i] > nums[i + 1]
  3. 计算山脉长度
    • 从峰值开始向左扩展,直到不满足递增条件,记录左边界
    • 从峰值开始向右扩展,直到不满足递减条件,记录右边界
    • 计算山脉长度为 right - left + 1,并更新最长山脉长度
  4. 处理特殊情况:如果没有找到任何山脉,返回 0

代码实现如下:

import java.util.ArrayList;public class Solution {public int longestmountain(ArrayList<Integer> nums) {int n = nums.size();if (n < 3) return 0;  // 至少需要三个元素形成山脉int maxLength = 0;for (int i = 1; i < n - 1; i++) {// 判断是否为山峰if (nums.get(i - 1) < nums.get(i) && nums.get(i) > nums.get(i + 1)) {int left = i - 1;int right = i + 1;// 向左扩展while (left > 0 && nums.get(left - 1) < nums.get(left)) {left--;}// 向右扩展while (right < n - 1 && nums.get(right + 1) < nums.get(right)) {right++;}// 计算当前山脉长度int currentLength = right - left + 1;maxLength = Math.max(maxLength, currentLength);}}return maxLength;}
}

解释

  • maxLength 记录最长山脉的长度。
  • 每当找到一个满足条件的山峰时,向左右扩展以计算山脉的实际长度。
  • 最后返回最大山脉的长度。

复杂度

  • 时间复杂度:O(n),因为我们在遍历数组时只对每个元素做有限次数的比较和扩展。
  • 空间复杂度:O(1),仅使用了固定的额外空间。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM | 论文精读 | NeurIPS 2023 | SWIFTSAGE: 结合快思考与慢思考的生成智能体

论文标题&#xff1a;SWIFTSAGE: A Generative Agent with Fast and Slow Thinking for Complex Interactive Tasks 作者&#xff1a;Bill Yuchen Lin, Yicheng Fu, Karina Yang, Faeze Brahman, Shiyu Huang, Chandra Bhagavatula, Prithviraj Ammanabrolu, Yejin Choi, Xian…

【Vue3】第二篇

Vue3学习第二篇 01. 事件处理02. 事件传参03. 事件修饰符04. 数组变化侦测05. 计算属性06. class绑定07. style绑定08. 侦听器09. 表单输入绑定10. 模板引用 01. 事件处理 在vue当中的事件处理和html、css中的不一样&#xff0c;它单独做了处理。 注意&#xff1a;用法中只是用…

【Android】浅析OkHttp(1)

【Android】浅析OkHttp&#xff08;1&#xff09; OkHttp 是一个高效、轻量级的 HTTP 客户端库&#xff0c;主要用于 Android 和 Java 应用开发。它不仅支持同步和异步的 HTTP 请求&#xff0c;还支持许多高级功能&#xff0c;如连接池、透明的 GZIP 压缩、响应缓存、WebSocke…

JUC并发编程面试题总结

文章目录 1、创建线程的三种方式2、线程的状态3、线程的上下文切换4、run和start的区别5、sleep和wait区别6、虚假唤醒&#xff0c;精确唤醒7、两阶段终止模式8、多线程下的线程安全问题9、如何解决线程安全问题10、synchornized的原理11、锁升级的机制12、锁消除13、批量重偏向…

Unity编辑器制作多级下拉菜单

Unity编辑器下拉菜单 大家好&#xff0c;我是阿赵。   在Unity引擎里面编写工具插件&#xff0c;有时候会用到一些特殊的菜单形式&#xff0c;比如下拉选项。 通过下拉菜单&#xff0c;给用户选择不同的选项。   如果只是一层的下拉列表&#xff0c;可以用EditorGUILayout.…

C++二级题 计算好数:1数大于0数(二进制的位运算)

1、题目 若将一个正整数化为二进制数&#xff0c;在此二进制数中&#xff0c;我们将数字1的个数多于数字0的个数的这类二进制数称为好数。 例如&#xff1a; (13)10 (1101)2&#xff0c;其中1的个数为3&#xff0c;0的个数为1&#xff0c;则此数是好数&#xff1b; (10)10 (1…

Nginx upstream

什么是Nginx upstream&#xff1f; Nginx 模块一般分为三大类&#xff1a;handler、filter和upstream。 利用 handler、filter 这两个模块&#xff0c;可以使 Nginx 轻松完成任何单机工作。 upstream 模块将使 Nginx 跨越单机的限制&#xff0c;完成网络数据的接收、处理和转…

【数学二】常微分方程-一阶微分方程

考试要求 1、了解微分方程及其阶、解、通解、初始条件和特解等概念. 2、掌握变量可分离的微分方程及一-阶线性微分方程的解法,会解齐次微分方程. 3、会用降阶法解下列形式的微分方程: y ( n ) f ( x ) , y ′ ′ f ( x , y ′ ) y^{(n)}f(x),y^{}f(x,y^{}) y(n)f(x),y′′f(…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-23

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-23 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-23目录1. Advancements in Visual Language Models for Remote Sensing: Datasets, Capabilities, and Enhancement Techniques摘…

git restore恢复删除文件

新版本 在 Git 2.23 版本之后&#xff0c;Git 引入了一个新的命令 git restore&#xff0c;用于简化文件恢复操作。可以用 git restore 来恢复误删除的文件。下面是详细的使用方法&#xff1a; 1. 恢复工作区中删除的文件&#xff08;未提交&#xff09; 如果文件已被删除&a…

对角双差速轮AGV平移、直行、转弯、原地旋转案例

在对角两对双差速轮 AGV(自动导引车)中,车辆配置了两对差速轮,分别安装在左前(Front Left,FL)和右后(Rear Right,RR)。这种配置使得 AGV 具有较高的机动性,可以实现平移、直行、转弯和原地旋转等复杂运动 2. 运动学模型 2.1 定义变量 车辆参数: r:车轮半径(米…

flask服务通过gunicorn启动

使用 Gunicorn 启动 Flask 服务通常可以提升 Flask 应用的性能。以下是通过 Gunicorn 启动 Flask 服务的步骤&#xff1a; 1. 安装依赖 首先&#xff0c;确保已安装 Flask 和 Gunicorn&#xff1a; pip install flask gunicorn2. 创建 Flask 应用 创建一个简单的 Flask 应用…

IPV6扩展头部

IPv6扩展头部&#xff08;Extension Header&#xff09;是一种用于在IPv6数据包中添加额外信息和功能的结构。与IPv4相比&#xff0c;IPv6的头部设计简化了基本头部&#xff0c;使其更灵活。扩展头部用于提供各种功能&#xff0c;如路由、分片、流量控制等。扩展头部的使用使得…

安全知识见闻-网络安全热门证书

一、OSCP(Offensive Security Certified Professional) 1. 证书介绍 2.考点 3.部分考试要求 4.练习方法 二、OSEP(Offensive Security Exploit Developer) 1.证书介绍 2.考点 3.练习方法 三、CISSP&#xff08;Certified lnformation Systems Security Professional&a…

技术成神之路:二十三种设计模式(导航页)

设计原则/模式链接面向对象的六大设计原则技术成神之路&#xff1a;面向对象的六大设计原则创建型模式单例模式建造者模式原型模式工厂方法模式抽象工厂模式行为型模式策略模式状态模式责任链模式观察者模式备忘录模式迭代器模式模板方法模式访问者模式中介者模式命令模式解释器…

【已解决,含泪总结】非root权限在服务器上配置python和torch环境,代码最终成功训练(一)

配置Python环境 没有root权限服务器上有多个python环境但没有自己想要的怎么办 之前跑别的实验的时候改过指定的python3.7版本&#xff0c;但是居然我过了一段时间之后&#xff0c;再次打开&#xff0c;python版本居然又回到2.7&#xff08;服务器/usr/下的默认python版本&am…

什么是AI神经网络?

文章目录 神经网络的基本概念如何工作&#xff1f;训练过程应用实例未来展望推荐阅读文章 在当今的科技时代&#xff0c;人工智能&#xff08;AI&#xff09;已经深入到我们生活的各个方面&#xff0c;而神经网络则是推动这一发展的重要技术之一。无论是在图像识别、自然语言处…

Zig 语言通用代码生成器:逻辑,冒烟测试版发布二

Zig 语言通用代码生成器&#xff1a;逻辑&#xff0c;冒烟测试版发布二 Zig 语言是一种新的系统编程语言&#xff0c;其生态位类同与 C&#xff0c;是前一段时间大热的 rust 语言的竞品。它某种意义上的确非常像 rust&#xff0c;尤其是在开发过程中无穷无尽抛错的过程&#x…

高等数学-宋浩版2.0-映射

映射&#xff1a;X,Y为非空集合&#xff0c;存在法则F,对X(原像)中每个元素X&#xff0c;按法则F&#xff0c;在Y中有唯一元素与之对应&#xff0c;F为x到Y&#xff08;镜像&#xff09;的映射。f:X->Y X原像&#xff0c;Y像&#xff0c;x定义域&#xff0c;Df,Rf &#x…

Mac book英特尔系列?M系列?两者有什么区别呢

众所周知&#xff0c;Mac book有M系列&#xff0c;搭载的是苹果自研的M芯片&#xff0c;也有着英特尔系列&#xff0c;搭载的是英特尔的处理器&#xff0c;虽然从 2020 年开始&#xff0c;苹果公司逐步推出了自家研发的 M 系列芯片&#xff0c;并逐渐将 MacBook 产品线过渡到 M…