// 5915. 找出临界点之间的最小和最大距离
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public int[] nodesBetweenCriticalPoints(ListNode head) {
// 保存 临界点
int[] criticalPoints = new int[2];
criticalPoints[0] = -1;
criticalPoints[1] = -1;
// 返回结果
// ans[0] : 最小距离
// ans[1] : 最大距离
int[] ans = new int[2];
// 默认给最小距离为int的最大值
ans[0] = Integer.MAX_VALUE;
// 记录当前下标,也可以从1开始,这里和数组保持一致
int index = 0;
// p : 记录可能为临界点的节点
// pre : p的前一个节点
ListNode p = head.next, pre = head;
// 当p的节点的next为null时结束
while(p.next != null){
// 判断p是否为 局部极大值点 或 局部极小值点
if((p.next.val < p.val && pre.val < p.val) || (p.next.val > p.val && pre.val > p.val)){
if(criticalPoints[0] == -1){
// 第一次找到临界点
criticalPoints[0] = index;
// 方便后面的计算,减少不必要的判断
criticalPoints[1] = index;
}else{
// 如果这是第二个临界点,此时 criticalPoints[1] 、criticalPoints[0] 相同
// 计算最新的最小距离
int nowSub = index - criticalPoints[1];
// 如果当前计算的最小距离小于已经记录的最小距离
if(nowSub < ans[0]){
ans[0] = nowSub;
}
// 更新临界点的最大下标
criticalPoints[1] = index;
}
}
// 节点统一向右移动
// 将当前p指向的节点 赋给 pre
pre = p;
// p移向p的下一个节点
p = p.next;
// 下标指向下一个节点
index++;
}
// 只有存在多于两个的临界点时,才会存在最大、最小距离
// 根据前面的代码criticalPoints[0、1] 可能都为 -1 或 为唯一找到的临界点下标
if(criticalPoints[0] == criticalPoints[1]){
// 设置为未找到
ans[0] = -1;
ans[1] = -1;
}else{
// 计算最大距离
ans[1] = criticalPoints[1] - criticalPoints[0];
}
return ans;
}
}
链表、遍历[5915] 找出临界点之间的最小和最大距离
最新推荐文章于 2024-07-10 16:47:58 发布