第76天(中等题 链表)

打卡第七十六天
1道简单题+2道中等题
image

题目:
image

思路:遍历链表并维护上一个和第一个临界点
image

代码:

class Solution {
public:
    vector<int> nodesBetweenCriticalPoints(ListNode* head) {
        if (!head || !head->next || !head->next->next) {
            return {-1, -1}; 
        }
        ListNode* a = head;                // 当前节点的前一个节点
        ListNode* b = head->next;          // 当前节点
        ListNode* c = head->next->next;    // 当前节点的下一个节点
        int first = 0, last = 0, minDis = INT_MAX; // 关键变量初始化
        int i = 1, prev = 0; // i是节点b的索引,prev记录上一个临界点位置

        while (c) { // 遍历链表直到c为nullptr
            // 判断b是否为临界点:
            if ((a->val < b->val && b->val > c->val) || 
                (a->val > b->val && b->val < c->val)) { // 情况1:局部最大值,情况2:局部最小值
                if (first == 0) {
                    first = i; // 记录第一个临界点的位置
                }
                last = i; // 更新最后一个临界点的位置
                if (prev > 0) {// 如果之前已经发现过的临界点
                    minDis = min(minDis, i - prev); // 计算并更新最小距离
                }
                prev = i; // 更新上一个临界点的位置为当前点
            }
            // 移动三个指针到下一组三个节点
            a = b; 
            b = c;
            c = c->next;
            ++i; 
        }
        if (first == last) { // 只有一个临界点
            return {-1, -1};
        }
        return {minDis, last - first};// 返回结果:最小距离和最大距离
    }
};

耗时≈一小时 明天继续

posted @ 2026-01-22 22:58  Wy0518  阅读(0)  评论(0)    收藏  举报