当前位置: 首页 > article >正文

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

上一篇:算法随笔_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:
                continue
            mLen=eL+eR+1
            maxL=max(maxL,mLen)
             
        return maxL
        
                


http://www.kler.cn/a/523864.html

相关文章:

  • 2025 春节联欢晚会魔术揭秘
  • 【最后203篇系列】007 使用APS搭建本地定时任务
  • Java面试题2025-并发编程基础(多线程、锁、阻塞队列)
  • SpringBoot中@Valid与@Validated使用场景详解
  • NPM 使用介绍
  • 2025-01-28 - 通用人工智能技术 - RAG - 本地安装 DeepSeek-R1对话系统 - 流雨声
  • DeepSeek助力学术文献搜索!
  • 安装VMware17
  • SQL进阶实战技巧:如何构建用户行为转移概率矩阵,深入洞察会话内活动流转?
  • JavaScript系列(45)--响应式编程实现详解
  • FFmpeg 自定义IO和格式转换
  • < OS 有关 > Android 手机 SSH 客户端 app: connectBot
  • JavaScript正则表达式
  • 【04-自己画P封装,并添加已有3D封装】
  • Ansible自动化运维实战--script、unarchive和shell模块(6/8)
  • 【第九天】零基础入门刷题Python-算法篇-数据结构与算法的介绍-六种常见的图论算法(持续更新)
  • leetcode 1493. 删掉一个元素以后全为 1 的最长子数组
  • 书生大模型实战营3
  • vs2013 使用 eigen 库编译时报 C2059 错的解决方法
  • 大数据Hadoop入门3
  • 2023年吉林省职业院校技能大赛网络系统管理样题-网络配置(华三代码)
  • electron typescript运行并设置eslint检测
  • (学习总结21)C++11 异常与智能指针
  • 第24章 质量培训与探啥未来
  • deepseek-r1 本地部署
  • 【SH】Windows禁用Alt+F4关机、重启、注销等功能,只保留关闭应用的功能