日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 2058. 找出临界点之间的最小和最大距离(链表)

發布時間:2024/7/5 编程问答 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 2058. 找出临界点之间的最小和最大距离(链表) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題

1. 題目

鏈表中的 臨界點 定義為一個 局部極大值點局部極小值點

如果當前節點的值 嚴格大于 前一個節點和后一個節點,那么這個節點就是一個 局部極大值點 。

如果當前節點的值 嚴格小于 前一個節點和后一個節點,那么這個節點就是一個 局部極小值點 。

注意:節點只有在同時存在前一個節點和后一個節點的情況下,才能成為一個 局部極大值點 / 極小值點 。

給你一個鏈表 head ,返回一個長度為 2 的數組 [minDistance, maxDistance] ,其中 minDistance 是任意兩個不同臨界點之間的最小距離,maxDistance 是任意兩個不同臨界點之間的最大距離。
如果臨界點少于兩個,則返回 [-1,-1] 。

示例 1:

輸入:head = [3,1] 輸出:[-1,-1] 解釋:鏈表 [3,1] 中不存在臨界點。

示例 2:

輸入:head = [5,3,1,2,5,1,2] 輸出:[1,3] 解釋:存在三個臨界點: - [5,3,1,2,5,1,2]:第三個節點是一個局部極小值點,因為 132 小。 - [5,3,1,2,5,1,2]:第五個節點是一個局部極大值點,因為 521 大。 - [5,3,1,2,5,1,2]:第六個節點是一個局部極小值點,因為 152 小。 第五個節點和第六個節點之間距離最小。minDistance = 6 - 5 = 1 。 第三個節點和第六個節點之間距離最大。maxDistance = 6 - 3 = 3

示例 3:

輸入:head = [1,3,2,2,3,2,2,2,7] 輸出:[3,3] 解釋:存在兩個臨界點: - [1,3,2,2,3,2,2,2,7]:第二個節點是一個局部極大值點,因為 312 大。 - [1,3,2,2,3,2,2,2,7]:第五個節點是一個局部極大值點,因為 322 大。 最小和最大距離都存在于第二個節點和第五個節點之間。 因此,minDistance 和 maxDistance 是 5 - 2 = 3 。 注意,最后一個節點不算一個局部極大值點,因為它之后就沒有節點了。

示例 4:

輸入:head = [2,3,3,2] 輸出:[-1,-1] 解釋:鏈表 [2,3,3,2] 中不存在臨界點。提示: 鏈表中節點的數量在范圍 [2, 10^5]1 <= Node.val <= 10^5

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/find-the-minimum-and-maximum-number-of-nodes-between-critical-points
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

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) {ListNode *prev = NULL, *cur = head, *next = head->next;int first = -1, ct = 0, prevpos = -1, curpos = -1, mindis = INT_MAX;while(cur){ct++;next = cur->next;if(prev && cur->next && ((prev->val > cur->val && next->val > cur->val)|| (prev->val < cur->val && next->val < cur->val))){curpos = ct;if(first == -1)first = ct;if(prevpos != -1)mindis = min(mindis, curpos-prevpos);prevpos = curpos;}prev = cur;cur = cur->next;}if(mindis == INT_MAX) return {-1, -1};return {mindis, curpos-first};} };

180 ms 110.6 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!

總結

以上是生活随笔為你收集整理的LeetCode 2058. 找出临界点之间的最小和最大距离(链表)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。