最长山峰问题

            给定一个数组,如果先递增,再递减,那么就可称为山峰,求给定数组的最长山峰,要求山峰的长度要大于3.

            问题分析: 将每一个元素都当成峰顶,依次计算左边和右边的最长长度,得到山峰长度。

          

public static int maxLength (int[] nums) {
        int result = 0;
        if(nums.length < 3){
            return 0;
        }
        //先将每一个点作为山峰顶点
        for(int i = 1; i <= nums.length - 2; i++){
            int left = i - 1;
            int right = i + 1;
            if(nums[left] < nums[i] && nums[right] < nums[i]){
                while(left >= 0 && nums[left] < nums[left + 1]){
                    left--;
                }
                while(right <= nums.length - 1 && nums[right] > nums[right - 1]){
                    right++;
                }
                int maxLength = right - left + 1;
                if(maxLength > result){
                    result = maxLength;
                }
            }
        }
        return result;
    }

### 最长峰形数组算法及实现 #### 什么是峰形数组? 峰形数组(Peak Array)是指一个数组中存在某个位置 `i`,使得该位置的值大于左右相邻的元素,并且数组整体呈现出一个“山峰”形状。即数组满足以下条件: 1. `arr[i] > arr[i-1]` 2. `arr[i] > arr[i+1]` 在最长峰形数组问题中,目标是找到一个连续子数组,其中该子数组形成一个峰形结构,并且长度尽可能长。 #### 解法思路 1. **遍历数组**:从数组的第二个元素开始,直到倒数第二个元素。 2. **判断峰值点**:对于每个位置 `i`,检查它是否是一个峰顶(即 `arr[i] > arr[i-1] && arr[i] > arr[i+1]`)。 3. **扩展峰形范围**:如果找到峰顶,则向左和向右扩展,直到不再满足递增或递减的条件。 4. **记录最大长度**:计算当前峰形数组的长度,并更新最大长度。 #### 实现代码 以下是一个C++实现示例: ```cpp #include <iostream> #include <vector> using namespace std; int longestPeak(vector<int>& arr) { int maxLen = 0; for (int i = 1; i < arr.size() - 1; i++) { // 判断是否为峰顶 if (arr[i] > arr[i - 1] && arr[i] > arr[i + 1]) { int left = i - 1; int right = i + 1; // 向左扩展 while (left > 0 && arr[left] > arr[left - 1]) { left--; } // 向右扩展 while (right < arr.size() - 1 && arr[right] > arr[right + 1]) { right++; } // 计算当前峰形数组长度 int currentLen = right - left + 1; maxLen = max(maxLen, currentLen); } } return maxLen; } int main() { vector<int> arr = {1, 2, 3, 4, 3, 2, 1, 0, 5, 6, 7, 8, 9, 8, 7, 6}; int result = longestPeak(arr); cout << "最长峰形数组的长度为: " << result << endl; return 0; } ``` #### 时间复杂度分析 - 外层循环遍历数组的时间复杂度为 O(n)。 - 内层循环(扩展峰形范围)的时间复杂度为 O(n),但每个元素最多被访问两次。 - 总体时间复杂度为 O(n)。 #### 空间复杂度分析 - 使用了常量级的额外空间,空间复杂度为 O(1)。 #### 示例运行结果 对于输入数组 `{1, 2, 3, 4, 3, 2, 1, 0, 5, 6, 7, 8, 9, 8, 7, 6}`,输出结果为 `9`,表示最长峰形数组的长度为 9。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值