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

文章目录

一、题目

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

输入

c 复制代码
[2,5,2,1,5]

输出

c 复制代码
4

说明

c 复制代码
 [2,5,2,1] 

1.2 示例2

输入

c 复制代码
[2,2,2,2,1]

输出

c 复制代码
0

说明

c 复制代码
没有山脉则输出 0 

1.3 提供的代码

c 复制代码
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

代码实现如下:

java 复制代码
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),仅使用了固定的额外空间。
相关推荐
bbaydnog4 分钟前
嵌入式面试高频题第5弹:DMA原理、看门狗机制、低功耗模式,这3个搞不懂简历直接被筛
面试·dma·嵌入式
无限码力15 分钟前
携程0510笔试真题【单数组交换】
算法·携程笔试·携程笔试真题·携程0510笔试真题
AI人工智能+电脑小能手29 分钟前
【大白话说Java面试题 第93题】【Mysql篇】第23题:从查找速度来看,聚集索引和非聚集索引哪个更快?
java·开发语言·数据库·mysql·面试
BlockWay1 小时前
WEEX Labs 周度观察:微软-OpenAI 合作调整与AI 多云趋势
大数据·人工智能·算法·安全·microsoft
风筝在晴天搁浅1 小时前
快手 CodeTop LeetCode 224.基本计算器
数据结构·算法·leetcode
Smoothcloud润云1 小时前
5大功能精修,重构AI算力使用体验!
java·人工智能·windows·算法·重构·编辑器·sublime text
计算机安禾2 小时前
【算法分析与设计】第41篇:确定性与非确定性多项式时间:P与NP的形式化
算法
浮午2 小时前
字节AI Agent开发面试全解析:15道高频问题+深度答案
人工智能·面试·职场和发展
JustHappy2 小时前
古法编程秘籍(四):函数究竟是什么?把函数最重要的能力一次讲清楚
前端·后端·面试
Byron__2 小时前
RabbitMQ 面试核心精讲
java·面试·rabbitmq