2058. Find the Minimum and Maximum Number of Nodes Between Critical Points
這道題目要求我們在一個 linked list中找出關鍵點之間的最小和最大節點數。以下是題目的主要內容:
- 我們有一個 linked list,每個節點都有一個值。
- 關鍵點定義為滿足以下條件之一的節點(不包括頭尾節點):
- 局部最大值:該節點的值大於前一個節點和後一個節點的值。
- 局部最小值:該節點的值小於前一個節點和後一個節點的值。
- 我們需要找出:
- 任意兩個關鍵點之間的最小距離
- 第一個和最後一個關鍵點之間的距離
- 如果關鍵點少於兩 個,則返回 [-1, -1]。
解題思路:
- 走訪 linked list,找出所有的關鍵點。
- 記錄每個關鍵點的索引位置。
- 計算相鄰關鍵點之間的最小距離。
- 計算第一個和最後一個關鍵點之間的距離。
- 返回結果。
初始化:
minDist
初始化為整數的最大值,用於記錄最小距離。prev
和cur
分別初始化為 linked list 的第一個和第二個節點。i
是當前節點的索引,從 1 開始。last
和first
用於記錄最後一個和第一個關鍵點的索引。
/**
* 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)
{
vector<int> res = {-1, -1};
int minDist = INT_MAX;
ListNode* prev = head;
ListNode* cur = head->next;
int i = 1;
int last = 0;
int first = 0;
while (cur->next)
{
// if (localMinimum || localMaximum)
if ((cur->val < prev->val && cur->val < cur->next->val) || (cur->val > prev->val && cur->val > cur->next->val))
{
// 如果這是第一個 critial point,則將 last 和 first 都設為當前的 index i。
if (last == 0)
{
last = i;
first = i;
}
else
{
minDist = min(minDist, i - last);
// 更新 last critial point
last = i;
}
}
i++;
// update the pointer
prev = cur;
cur = cur->next;
}
if (minDist != INT_MAX)
{
// maxDist 即為 last - first
int maxDist = last - first;
res = {minDist, maxDist};
}
return res;
}
};
- T:
- S: