LeetCode刷题笔记- 845.数组中的最长山脉
C语言
struct mount_st {
    int up;
    int down;
    int is_mountain;
};
#define MAX_ONE(a,b) ((a)>(b)?(a):(b))
int copy(struct mount_st *dst, struct mount_st *src)
{
    memcpy(dst, src, sizeof(struct mount_st));
    return 1;
}
int longestMountain(int* arr, int arrSize){
    struct mount_st *dp = NULL;
    int i;
    int max = 0;
    dp = calloc(arrSize, sizeof(struct mount_st));
    for (i = 1; i < arrSize; i++) {
        if (dp[i-1].is_mountain) { //上一个迭代山脉状态
            if (arr[i] < arr[i-1]) { //延续山脉状态
                copy(&dp[i], &dp[i-1]);
                dp[i].down += 1;
                max = MAX_ONE(max, dp[i].up + dp[i].down + 1);
                continue;
            }
            if(arr[i] > arr[i-1]) {//初始化非山脉状态
                dp[i].up = 1;
            }
        } else { //上一个迭代非山脉状态
            if(arr[i] > arr[i-1]) { 
                dp[i].up = dp[i-1].up + 1;
                continue;
            }
            if(arr[i] < arr[i-1] && dp[i-1].up > 0) { //转山脉状态
                copy(&dp[i], &dp[i-1]);
                dp[i].is_mountain = 1;
                dp[i].down = 1;
                max = MAX_ONE(max, dp[i].up + dp[i].down + 1);
                continue;
            }
        }
    }
    free(dp);
    dp = NULL;
    return max;
}
思想
动态规划
| 状态 | 子问题 | 
|---|---|
| 山脉 | 1.延续山脉 ;2.未延续山脉初始化 ; | 
| 非山脉 | 1.数据上坡延续;2.数据下坡直接初始化; | 
注意点
- 计算山脉长度需要包含山峰节点,即dp[i].up + dp[i].down + 1;
- 检查max是否延续;
- 注意在山脉状态下切非山脉状态的初始化,避免漏节点;
结果











