列表

详情


NC406. 最长山脉

描述

给定一个长度为 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

输入:

[2,5,2,1,5]

输出:

4

说明:

 [2,5,2,1]

示例2

输入:

[2,2,2,2,1]

输出:

0

说明:

没有山脉则输出 0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 20ms, 内存消耗: 3012KB, 提交时间: 2022-07-11

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int longestmountain(vector<int>& nums) {
        // write code here
        int n=nums.size();
        vector<int> l(n);
        vector<int> r(n);
        for(int i=1;i<n;++i){
            if(nums[i]>nums[i-1]){
                l[i]=l[i-1]+1;
            }
        }
        for(int i=n-2;i>=0;--i){
            if(nums[i]>nums[i+1]){
                r[i]=r[i+1]+1;
            }
        }
        int res=0;
        for(int i=0;i<n;++i){
            if(l[i]>0&&r[i]>0&&res<l[i]+r[i]+1){
                res=l[i]+r[i]+1;
            }
        }
        return res;
    }
};

C++ 解法, 执行用时: 20ms, 内存消耗: 3140KB, 提交时间: 2022-04-26

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int longestmountain(vector<int>& nums) {
        int i,sz=nums.size(),res=0;
        if(sz>=3)
        {
            vector<int> left(sz-2),right(sz-2);
            left[0]=(nums[0]<nums[1])?1:0;
            right[sz-3]=(nums[sz-1]<nums[sz-2])?1:0;
            for(i=1;i<sz-2;i++)
            {
                left[i]=(nums[i]<nums[i+1])?(left[i-1]+1):0;
                right[sz-i-3]=(nums[sz-i-1]<nums[sz-i-2])?(right[sz-i-2]+1):0;
            }
            for(i=0;(i<sz-2)&&(res<sz-1);i++)
            {
                if((left[i]>0)&&(right[i]>0))
                    res=(res>=(left[i]+right[i]))?res:(left[i]+right[i]);
            }
            if(res>0)
                res++;
        }
        return res;
    }
};

C 解法, 执行用时: 21ms, 内存消耗: 2884KB, 提交时间: 2022-08-02

int longestmountain(int* nums, int numsLen ) {
    int z = 0;
    for(int i = 1; i < numsLen -1; i++)
    {
        int a = 1;
        for(int j = i - 1; j > -1; j--)
        {
            if(nums[j] >= nums[j + 1])
            {
                break;
            }
            a++;
        }
        for(int k = i + 1; k < numsLen; k++)
        {
            if(nums[k] >= nums[k - 1])
            {
                break;
            }
            a++;
        }
        if(a > z)
        {
            z= a;
        }
    }
    if(z > 2)
    {
        return z;
    }
    return 0;
}

C++ 解法, 执行用时: 21ms, 内存消耗: 2992KB, 提交时间: 2022-06-14

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int longestmountain(vector<int>& nums) {
        // write code here
        int size = nums.size();
        int res = 0;
        vector<int> left(size);
        for(int i = 1; i < size; ++i){
            if(nums[i-1] < nums[i]){
                left[i] = left[i-1]+1;
            }
        }
        vector<int> right(size);
        for(int i = size-2; i >=0; --i){
            if(nums[i+1] < nums[i]){
                right[i] = right[i+1]+1;
            }
        }
        for(int i = 0; i < size; ++i){
            if(left[i] > 0 && right[i] > 0){
                res = max(right[i]+left[i]+1, res);
            }
        }
        return res;
    }
};

C++ 解法, 执行用时: 21ms, 内存消耗: 2992KB, 提交时间: 2022-04-28

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int longestmountain(vector<int>& nums) {
        // write code here
        int n=nums.size();
        vector<int>r(n);
        vector<int>l(n);
        l[0]=0;
        r[n-1]=0;
        for(int i=1;i<n;i++){
            if(nums[i]>nums[i-1]){
                l[i]=l[i-1]+1;
            }
        }
        for(int i=n-2;i>=0;i--){
            if(nums[i]>nums[i+1]){
                r[i]=r[i+1]+1;
            }
        }
        int res=0;
        for(int i=0;i<n;i++){
            if(l[i]>0&&r[i]>0&&res<r[i]+l[i]+1){
                res=r[i]+l[i]+1;
            }
        }
        return res;
    }
};

上一题