题目
链表中的 临界点 定义为一个 局部极大值点 或 局部极小值点 。
如果当前节点的值 严格大于 前一个节点和后一个节点,那么这个节点就是一个 局部极大值点 。
如果当前节点的值 严格小于 前一个节点和后一个节点,那么这个节点就是一个 局部极小值点 。
注意:节点只有在同时存在前一个节点和后一个节点的情况下,才能成为一个 局部极大值点 / 极小值点 。
给你一个链表 head
,返回一个长度为 2 的数组 [minDistance, maxDistance]
,其中 minDistance
是任意两个不同临界点之间的最小距离,maxDistance
是任意两个不同临界点之间的最大距离。如果临界点少于两个,则返回 [-1,-1]
示例
思路
1. 最小距离存在于相邻的两个极值点之间,而最大距离存在于第一个和最后一个极值点之间
2. 在遍历的过程中,记录下刚刚得到的极值点的位置以及第一个极值点的位置
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
vector<int> nodesBetweenCriticalPoints(ListNode* head) {
if(head==NULL) return {-1,-1};
bool flag = false;
ListNode *p = head;
int id1 = -1,id2 = -1,pos = 0;
int minDis = -1,maxDis = -1;
while(p->next->next){
int pre = p->val;
int mid = p->next->val;
int last = p->next->next->val;
//当前是极值点
if(mid < min(pre,last) || mid > max(pre,last)){
if(id2 != -1){ //第二个极值点被找出
//则用相邻临界点的距离来更新最小值
minDis = (minDis == -1 ? pos - id2 : min(minDis,pos-id2));
maxDis = max(maxDis,pos-id1);
}
//第一个极值点还没被找到,则更新为当前位置,后面不再改变
if(id1 == -1){
id1 = pos;
}
//实时更新第二个极值点
id2 = pos;
}
p = p->next;
++pos;
}
return {minDis,maxDis};
}
};