第76天(中等题 链表)
打卡第七十六天
1道简单题+2道中等题

题目:

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

代码:
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};// 返回结果:最小距离和最大距离
}
};
耗时≈一小时 明天继续

浙公网安备 33010602011771号