给定一个长度为 n 的正整数数组,每个元素表示一座山的高度。
其中满足以下条件的连续子数组称为山脉:
1.长度大于等于3
2.存在下标 i ,满足 nums[0] < nums[1] < nums[2] < ... < nums[i] , nums[i] > nums[i+1] > nums[i+2] ... > nums[i+k]
请你找出最长山脉的长度
数据范围:
, 数组中的元素满足
[2,5,2,1,5]
4
[2,5,2,1]
[2,2,2,2,1]
0
没有山脉则输出 0
这个题目可以通过遍历数组来解决,寻找满足条件的最长山脉。我们需要记录每座山脉的起点、峰值和终点,并计算最大长度。
思路如下:
nums[i] 是峰值,当它满足 nums[i - 1] < nums[i] > nums[i + 1]。 right - left + 1,并更新最长山脉长度。 0。 代码实现如下:
import java.util.ArrayList;
public class Solution {
public int longestmountain(ArrayList<Integer> nums) {
int n = nums.size();
if (n < 3) return 0; // 至少需要三个元素形成山脉
int maxLength = 0;
for (int i = 1; i < n - 1; i++) {
// 判断是否为山峰
if (nums.get(i - 1) < nums.get(i) && nums.get(i) > nums.get(i + 1)) {
int left = i - 1;
int right = i + 1;
// 向左扩展
while (left > 0 && nums.get(left - 1) < nums.get(left)) {
left--;
}
// 向右扩展
while (right < n - 1 && nums.get(right + 1) < nums.get(right)) {
right++;
}
// 计算当前山脉长度
int currentLength = right - left + 1;
maxLength = Math.max(maxLength, currentLength);
}
}
return maxLength;
}
} maxLength 记录最长山脉的长度。 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
} 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;
}
}
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;
}
};
# -*- 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