算法随笔_19: 数组中的最长山脉

embedded/2025/1/24 8:32:47/

上一篇:算法随笔_18: 划分字母区间-CSDN博客

======================

题目描述如下:

把符合下列属性的数组 arr 称为 山脉数组 :

  • arr.length >= 3
  • 存在下标 i0 < i < arr.length - 1),满足
    • arr[0] < arr[1] < ... < arr[i - 1] < arr[i]
    • arr[i] > arr[i + 1] > ... > arr[arr.length - 1]

给出一个整数数组 arr,返回最长山脉子数组的长度。如果不存在山脉子数组,返回 0 。

示例 1:

输入:arr = [2,1,4,7,3,2,5]
输出:5
解释:最长的山脉子数组是 [1,4,7,3,2],长度为 5。

======================

算法思路:

根据题目要求,山脉数组的样式需要以一个元素为山顶,向两边数值递减。那么这个元素左侧递减延伸的长度加上右侧递减延伸的长度,即为以这个元素为山顶的山脉的长度。

我们枚举数组中的所有元素,对于每个元素,我们都计算一下以这个元素为山顶的山脉长度。最后取一个最大值即为答案。

那么如何计算这个元素左侧递减延伸的长度呢?通过分析,我们又发现了另一个现象。我们设元素i的左侧递减延伸的长度为eL,如果元素i的数值小于元素i+1的数值,那么元素i+1的左侧递减延伸的长度就为eL+1。

很明显,这是一个递推的情形。我们可以从左向右遍历数组。计算出所有元素的左侧递减延伸的长度,并记录在变量expandL中。

同理,我们设元素i的右侧递减延伸的长度为eR,如果元素i的数值小于元素i-1的数值,那么元素i-1的右侧递减延伸的长度就为eR+1。我们可以从右向左遍历数组。计算出所有元素的右侧递减延伸的长度,并记录在变量expandR中。

最终,每个元素为山顶的山脉长度就等于eL+eR+1。

下面是代码实现:

注: 代码中的expandR数组的顺序与arr的顺序正好相反,即,expandR数组的第1个元素表示以arr数组最后一个元素为山顶的右侧递减延伸的长度。以此类推。

class Solution(object):def longestMountain(self, arr):""":type arr: List[int]:rtype: int"""expandL=[0]expandR=[0]arrLen=len(arr)for i in range(1,arrLen):if arr[i]>arr[i-1]:expandL.append(expandL[i-1]+1)else:expandL.append(0)if arr[arrLen-i]<arr[arrLen-i-1]:expandR.append(expandR[i-1]+1)else:expandR.append(0)maxL=0       for i in range(arrLen):eL=expandL[i]eR=expandR[arrLen-i-1]if eL==0 or eR==0:continuemLen=eL+eR+1maxL=max(maxL,mLen)return maxL


http://www.ppmy.cn/embedded/156525.html

相关文章

详细介绍:云原生技术细节(关键组成部分、优势和挑战、常用云原生工具)

目录 前言1、云原生架构的关键组成部分1.1、微服务架构&#xff08;Microservices Architecture&#xff09;1.2、容器化&#xff08;Containerization&#xff09;1.3、容器编排&#xff08;Container Orchestration&#xff09;1.4、服务网格&#xff08;Service Mesh&#x…

人脸识别【python-基于OpenCV】

1. 导入并显示图片 #导入模块 import cv2 as cv#读取图片 imgcv.imread(img/wx(1).jpg) #路径名为全英文&#xff0c;出现中文 图片加载失败,"D:\picture\wx.jpg" #显示图片 &#xff08;显示标题&#xff0c;显示图片对象&#xff09; cv.imshow(read_picture,im…

202009 青少年软件编程等级考试C/C++ 二级真题答案及解析(电子学会)

第 1 题 循环数 若一个n位的数字串满足下述条件,则称其是循环数(cyclic):将这个数字串视为整数(可能带有前导0),并用任意一个 1 到 n 之间(包含1和n)的整数去乘它时, 会得到一个将原数字串首尾相接后,再在某处断开而得到的新数字串所对应的整数。例如,数字 142857 是循环…

Jvm工具

1 jmap 1.1 命令格式 jmap [option] <pid>(to connect to running process) 连接到正在运行的进程jmap [option] <executable <core>(to connect to a core file) 连接到核心文件jmap [option] [server_id]<remote server IP or hostname>(to conne…

吴恩达深度学习——神经网络介绍

文章内容来自BV11H4y1F7uH&#xff0c;仅为个人学习所用。 文章目录 什么是神经网络引入神经网络神经元激活函数ReLU隐藏单元 用神经网络进行监督学习监督学习与无监督学习举例 什么是神经网络 引入 已经有六个房子的数据集&#xff0c;横轴为房子大小&#xff0c;纵轴为房子…

Go 切片:用法和本质

要想更好的了解一个知识点&#xff0c;实战是最好的经历。 题目 我这里放一道题目&#xff1a; package mainimport "fmt"func SliceRise(s []int) {s append(s, 0)for i : range s {s[i]}fmt.Println(s) }func SlicePrint() {s1 : []int{1, 2}s2 : s1s2 append…

什么是生成式大模型?大模型与生成式大模型的区别?

生成式大模型&#xff08;Large Generative Models&#xff09;是指具有大量参数的人工智能模型&#xff0c;它们能够生成新的内容&#xff0c;如文本、图片、音乐等。这类模型通常基于深度学习技术&#xff0c;尤其是神经网络&#xff0c;能够捕捉到数据的复杂分布&#xff0c…

《从入门到精通:蓝桥杯编程大赛知识点全攻略》(五)-数的三次方根、机器人跳跃问题、四平方和

本博客将详细探讨如何通过二分查找算法来解决这几个经典问题。通过几个实际的例子&#xff0c;我们将展示如何在这些问题中灵活应用二分查找&#xff0c;优化计算过程&#xff0c;并在面对大数据量时保持高效性。 目录 前言 数的三次方根 算法思路 代码如下 机器人跳跃问题…