首页 > 试题广场 >

最长山脉

[编程题]最长山脉
  • 热度指数:857 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为 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 
package main
//import "fmt"

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @return int整型
*/
func longestmountain( nums []int ) int {
    max:=0
    for i,x:=range nums{
        if i!=0&&i!=len(nums)-1{
            if x>nums[i-1]&&x>nums[i+1]{
                tot:=1
                l,r:=i-1,i+1
                lv,rv:=x,x
                for l>=0&&nums[l]<lv{
                    tot++
                    lv=nums[l]
                    l--
                }
                for r<len(nums)&&nums[r]<rv{
                    tot++
                    rv=nums[r]
                    r++
                }
                if tot>max{
                    max=tot
                }
            }
        }
    }
    return max
}

发表于 2023-03-29 09:01:56 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型ArrayList 
     * @return int整型
     */
    public int longestmountain (ArrayList<Integer> nums) {
        int count = 0;
        int res = 0;
        nums.add(10001);
        for (int i = 1; i < nums.size(); i++) {
            if (nums.get(i) > nums.get(i - 1)) {
                count++;
            }
            if (nums.get(i) < nums.get(i - 1)) {
                count++;
                if (nums.get(i) <= nums.get(i + 1)) {
                    res = Math.max(res, count + 1);
                    count = 0;
                }
            }
        }
        return res;
    }
}

发表于 2022-08-18 21:43:17 回复(0)
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int longestmountain(vector<int>& nums) {
        // write code here
        //两边遍历得到从左到右、从右到左的以各元素为结尾的连续上升子序列长度,分别存在left和right数组中
        vector<int> left(nums.size(),1);
        for(int i=1;i<nums.size();i++)
        {
            if(nums[i]>nums[i-1])
            {
                left[i]=left[i-1]+1;
            }
            else
            {
                left[i]=1;
            }
        }
        vector<int> right(nums.size(),1);
        for(int i=nums.size()-2;i>=0;i--)
        {
            if(nums[i]>nums[i+1])
            {
                right[i]=right[i+1]+1;
            }
            else
            {
                right[i]=1;
            }
        }
        int maxx=0;
        for(int i=0;i<nums.size();i++)
        {
            if((left[i]>1)&&(right[i]>1))//两边需要有起伏才符合山脉定义
                maxx=max(maxx,left[i]+right[i]-1);
        }
        return maxx;
    }
};
发表于 2022-07-01 11:43:40 回复(0)
# -*- coding: utf-8 -*-


#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param nums int整型一维数组
# @return int整型
#
class Solution:
    """
    题目:
        https://www.nowcoder.com/practice/f4e974a50eda429fbf36515a4197b148?tpId=196&tqId=40556&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3FjudgeStatus%3D3%26page%3D1%26pageSize%3D50%26search%3D%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196&difficulty=undefined&judgeStatus=3&tags=&title=
    算法:
        left[i]表示以下标i结尾的连续递增子数组的长度,right[i]表示以下标i开头的连续递减子数组的长度。
        初始化:
            left[0] = 1
            right[-1] = 1
        状态转移方程:
            left[i] = left[i - 1] + 1 if nums[i] > nums[i - 1] else 1
            right[i] = right[i + 1] + 1 if nums[i] > nums[i + 1] else 1
        遍历下标1 ~ n - 2,:
            m = left[i] + right[i] - 1
            如果山脉长度m大于等于3,更新res
        找不到山脉,则返回0
    复杂度:
        时间复杂度:O(n)
        空间复杂度:O(n)
    """

    def longestmountain(self, nums):
        # write code here
        n = len(nums)

        left, right = [1] * n, [1] * n
        for i in range(1, n):
            if nums[i] > nums[i - 1]:
                left[i] = left[i - 1] + 1
        for j in range(n - 2, -1, -1):
            if nums[j] > nums[j + 1]:
                right[j] = right[j + 1] + 1

        res = 0
        for i in range(1, n - 1):
            m = left[i] + right[i] - 1
            if m >= 3:
                res = max(res, m)
        return res


if __name__ == "__main__":
    sol = Solution()

    # nums = [2, 5, 2, 1, 5]

    nums = [2, 2, 2, 2, 1]

    res = sol.longestmountain(nums)

    print res

发表于 2022-06-29 16:35:07 回复(0)