# [2058\. Find the Minimum and Maximum Number of Nodes Between Critical Points](https://leetcode.com/problems/find-the-minimum-and-maximum-number-of-nodes-between-critical-points/) 這道題目要求我們在一個 linked list中找出關鍵點之間的最小和最大節點數。以下是題目的主要內容: 1. 我們有一個 linked list,每個節點都有一個值。 2. 關鍵點定義為滿足以下條件之一的節點(不包括頭尾節點): - 局部最大值:該節點的值大於前一個節點和後一個節點的值。 - 局部最小值:該節點的值小於前一個節點和後一個節點的值。 3. 我們需要找出: - 任意兩個關鍵點之間的最小距離 - 第一個和最後一個關鍵點之間的距離 4. 如果關鍵點少於兩個,則返回 \[-1, -1\]。 解題思路: 1. 走訪 linked list,找出所有的關鍵點。 2. 記錄每個關鍵點的索引位置。 3. 計算相鄰關鍵點之間的最小距離。 4. 計算第一個和最後一個關鍵點之間的距離。 5. 返回結果。 初始化: - `minDist` 初始化為整數的最大值,用於記錄最小距離。 - `prev` 和 `cur` 分別初始化為 linked list 的第一個和第二個節點。 - `i` 是當前節點的索引,從 1 開始。 - `last` 和 `first` 用於記錄最後一個和第一個關鍵點的索引。 :::spoiler Solution ```cpp= /** * 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; } }; ``` - 時間複雜度:$O(n)$ - 空間複雜度:$O(1)$ :::
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up