惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
IT之家
IT之家
博客园_首页
量子位
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
博客园 - 聂微东
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell
Hugging Face - Blog
Hugging Face - Blog
V
V2EX
爱范儿
爱范儿
大猫的无限游戏
大猫的无限游戏
宝玉的分享
宝玉的分享
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
雷峰网
雷峰网
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google DeepMind News
Google DeepMind News
Microsoft Azure Blog
Microsoft Azure Blog
有赞技术团队
有赞技术团队
S
SegmentFault 最新的问题
Engineering at Meta
Engineering at Meta
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

OhYee 博客

小鹏辅助驾驶测评|OhYee 博客 小鹏非支持手机开启自动解锁|OhYee 博客 使用函数计算实现 301 重定向|OhYee 博客 针对 HTML 内容使用 Ant Design 图片弹框|OhYee 博客 博客进程泄露及僵尸进程解决|OhYee 博客 蓝易云服务器体验|OhYee 博客 SSH 调起本地 VSCode|OhYee 博客 【2022 秋招内推】阿里云后端研发工程师|OhYee 博客 使用函数计算获取 IP 地址信息|OhYee 博客 正确获取客户端 IP/HTTP Header 也可能重复|OhYee 博客 评测 Oculus Quest2 及 BigScreen|OhYee 博客 NextJS 热重载保留状态|OhYee 博客 如何优雅地贴 gist 代码|OhYee 博客 Linux 精细化文件权限|OhYee 博客 VSCode 容器开发环境|OhYee 博客 Clash 的不兼容更新排查|OhYee 博客 Zeek 导出 PCAP|OhYee 博客 记一次 ssh 配置问题|OhYee 博客 Git Commit 规范化工具|OhYee 博客 谈谈《星之卡比-探索发现》|OhYee 博客 VSCode 快捷键绑定 Shell 命令|OhYee 博客 ASN.1 语法及 X.509 证书格式解析解析|OhYee 博客 腾讯企业邮箱忽略 MX 记录发信|OhYee 博客 Chrome/Edge 标签组插件|OhYee 博客 【应届内推】阿里云后端研发工程师|OhYee 博客 损坏的 Typecho 备份处理为 JSON|OhYee 博客 VS Code VIM 插件高效使用|OhYee 博客 SSH 正反向代理|OhYee 博客 Let's Encrypt 根证书过期引发的问题|OhYee 博客 OpenWRT 忽略内核依赖|OhYee 博客
LeetCode 941.有效的山脉数组|OhYee 博客
2020-11-03 · via OhYee 博客

久违地开始刷题,先从简单的开始,慢慢地提升难度,尽可能把题解写的不那么水

这是一篇最后编辑于 6 年前 的文章,其内容可能与目前实际情况差异较大,请注意甄别

LeetCode 941.有效的山脉数组

题目描述

给定一个整数数组A,如果它是有效的山脉数组就返回true,否则返回false

让我们回顾一下,如果A满足下述条件,那么它是一个山脉数组:

  • A.length >= 3
  • 0 < i < A.length - 1条件下,存在i使得:
    • A[0] < A[1] < ... A[i-1] < A[i]
    • A[i] > A[i+1] > ... > A[A.length - 1]

提示

0 <= A.length <= 10000
0 <= A[i] <= 10000

输入输出示例

示例 1
输入:[2,1]
输出:false

示例 2
输入:[3,5,5]
输出:false

示例 3
输入:[0,3,2,1]
输出:true

题解

这道题本身没有任何需要特别注意的点,最坏情况下也只是多提交几次补全所有情况。

对于这种题目,应该思考的是,如何在第一次尽可能地覆盖所有可能。首先读题:要求数组至少有 3 个元素,并且先是一个严格递增部分,而后是一个严格递减部分。

第一个限定条件很容易确定:至少有三个元素。进行一个长度判断即可
第二个限定条件是:存在严格递增和严格递减部分。也即保证第一个小于第二个,倒数而第二个大于倒数第一个(由于上一个条件已经确保至少三个,因此这里不会溢出)。
第三个限定条件是:严格递增(减)。也即不存在相邻的相等数(可能在上升和下降部分重复出现),因此在遍历过程发现相同应该直接结束
最后就是正常的遍历过程,由于只需要相邻数对比,因此只需要缓存上一个数。同时由于前两个数已经遍历,因此可以直接从第二个数开始判断。

代码

bool validMountainArray(int* A, int ASize){
    if (ASize < 3) return false; // 高度足够
    if (A[0] >= A[1] || A[ASize-2] <= A[ASize-1]) return false; // 必定存在上升过程和下降过程

    bool up = true;
    int lst = A[1];
    for (int i = 2; i<ASize; ++i){
        int now = A[i];
        if (now == lst) return false; // 禁止相等
        if (up) {
            if (now < lst) up = false;
        } else {
            if (now > lst) return false;
        }
        lst = now;
    }
    return true;
}