941. Valid Mountain Array

题目:

Given an array of integers arr, return true if and only if it is a valid mountain array.

Recall that arr is a mountain array if and only if:

  • arr.length >= 3
  • There exists some i with 0 < i < arr.length - 1 such that:
    • arr[0] < arr[1] < ... < arr[i - 1] < A[i]
    • arr[i] > arr[i + 1] > ... > arr[arr.length - 1]

 

Example 1:

Input: arr = [2,1]
Output: false

Example 2:

Input: arr = [3,5,5]
Output: false

Example 3:

Input: arr = [0,3,2,1]
Output: true

 

Constraints:

  • 1 <= arr.length <= 10^4
  • 0 <= arr[i] <= 10^4

 

思路1:

题意是找数组是不是一个山峰型的组,必须完整,半峰也返回false。作为一道easy题只有33%的通过率,不是很确定原因。正常思路是走一遍数组,只要一直上升就每次更新当前最高点的index,如果中途遇到了相等,则false。如果遇到下降,break出来。这里需要检查是不是半峰,如果最高点index是0,说明并没有上升,直接就下降了;如果最高点已经是数组的最后一个,那就是一直在上升,没有下降空间,这两种情况都直接false。然后就从当前最高点继续往下扫描,维持一直降的情况就好了。这是我做的比较直白的方法,思路2中介绍Lee神Lee215的逻辑上更高级的方法。

 

代码1:

class Solution {
public:
    bool validMountainArray(vector<int>& arr) {
        if(arr.size()<3)
            return false;
        int high=0;
        for(int i=1;i<arr.size();i++)
        {
            if(arr[i]==arr[i-1])
                return false;
            else if(arr[i]>arr[i-1])
                high=i;
            else
                break;
        }
        if(high==0||high==arr.size()-1)
            return false;
        for(int i=high+1;i<arr.size();i++)
        {
            if(arr[i]>=arr[i-1])
                return false;
        }
        return true;
    }
};

 

思路2:

用双指针法。两个人爬山,一个从左到右,一个从右到左,如果是一个正确的峰型,应该都是一路上升,然后在同一点即山峰遇到。最后需要检查的是三件事:是不是在同一点遇到,左边是不是在数组第一位(一直降低的半峰),右边是不是在数组最后一位(一直增高的半峰),三点同时成立即可返回true。时间复杂度和思路1一样都是O(n),但是个人感觉逻辑上这个更高级。

 

代码2:   

bool validMountainArray(vector<int>& A) {
        int n = A.size(), i = 0, j = n - 1;
        while (i + 1 < n && A[i] < A[i + 1]) i++;
        while (j > 0 && A[j - 1] > A[j]) j--;
        return i > 0 && i == j && j < n - 1;
    }

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值