当前位置: 首页 > news >正文

【算法】2058.找出临界点之间的最小和最大距离--通俗讲解

一、题目是啥?一句话说清

给定一个链表,找出所有局部极大值点和极小值点(临界点),然后计算这些临界点之间的最小距离和最大距离。

示例:

  • 输入:1 → 3 → 2 → 4 → 1 → 5
  • 输出:[1, 3](最小距离1,最大距离3)

二、解题核心

遍历链表,找到所有临界点(比前后节点都大或都小的节点),记录它们的位置,然后计算相邻临界点的最小距离和首尾临界点的最大距离。

这就像在一座座山峰和山谷中,找出相邻山峰/山谷之间的最短距离和最远距离。

三、关键在哪里?(3个核心点)

想理解并解决这道题,必须抓住以下三个关键点:

1. 临界点的识别

  • 是什么:局部极大值点(比前后节点都大)和局部极小值点(比前后节点都小)。
  • 为什么重要:这是题目的基础,只有正确识别临界点,才能进行后续的距离计算。

2. 位置记录

  • 是什么:记录每个临界点在链表中的位置(索引)。
  • 为什么重要:通过位置可以计算临界点之间的距离,位置差就是距离。

3. 距离计算

  • 是什么:最小距离是相邻临界点位置差的最小值,最大距离是第一个和最后一个临界点位置差。
  • 为什么重要:这是题目的最终要求,需要正确计算并返回结果。

四、看图理解流程(通俗理解版本)

假设链表为:1 → 3 → 2 → 4 → 1 → 5

  1. 识别临界点

    • 节点3:比前后节点1和2都大 → 局部极大值点(位置1)
    • 节点2:比前后节点3和4都小 → 局部极小值点(位置2)
    • 节点4:比前后节点2和1都大 → 局部极大值点(位置3)
    • 节点1:比前后节点4和5都小 → 局部极小值点(位置4)
  2. 临界点位置:[1, 2, 3, 4]

  3. 计算距离

    • 相邻距离:2-1=1, 3-2=1, 4-3=1
    • 最小距离:min(1,1,1) = 1
    • 最大距离:4-1 = 3
  4. 返回结果:[1, 3]

五、C++ 代码实现(附详细注释)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;// 链表节点定义
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 == nullptr || head->next == nullptr || head->next->next == nullptr) {return {-1, -1}; // 链表长度不足3,不可能有临界点}vector<int> criticalPoints; // 存储临界点的位置int pos = 1; // 当前节点位置(从0开始计数)ListNode* prev = head;ListNode* curr = head->next;ListNode* next = curr->next;// 遍历链表,寻找临界点while (next != nullptr) {// 检查当前节点是否是临界点if ((curr->val > prev->val && curr->val > next->val) || (curr->val < prev->val && curr->val < next->val)) {criticalPoints.push_back(pos);}// 移动指针prev = curr;curr = next;next = next->next;pos++;}// 如果临界点少于2个,返回[-1, -1]if (criticalPoints.size() < 2) {return {-1, -1};}// 计算最小距离和最大距离int minDistance = INT_MAX;int maxDistance = criticalPoints.back() - criticalPoints.front();// 计算相邻临界点之间的最小距离for (int i = 1; i < criticalPoints.size(); i++) {minDistance = min(minDistance, criticalPoints[i] - criticalPoints[i - 1]);}return {minDistance, maxDistance};}
};// 辅助函数:打印数组
void printVector(const vector<int>& vec) {for (int num : vec) {cout << num << " ";}cout << endl;
}// 测试代码
int main() {// 构建示例链表:1->3->2->4->1->5ListNode* head = new ListNode(1);head->next = new ListNode(3);head->next->next = new ListNode(2);head->next->next->next = new ListNode(4);head->next->next->next->next = new ListNode(1);head->next->next->next->next->next = new ListNode(5);Solution solution;vector<int> result = solution.nodesBetweenCriticalPoints(head);printVector(result); // 输出:1 3// 释放内存while (head != nullptr) {ListNode* temp = head;head = head->next;delete temp;}return 0;
}

六、时间空间复杂度

  • 时间复杂度:O(n),其中n是链表长度。需要遍历链表一次来寻找临界点,然后遍历临界点数组一次来计算距离。
  • 空间复杂度:O(k),其中k是临界点的数量。用于存储临界点位置。

七、注意事项

  • 链表长度检查:链表长度至少为3才可能有临界点,因为临界点需要前后节点。
  • 边界条件:处理空链表、单节点链表、双节点链表等情况,这些情况都没有临界点。
  • 临界点定义:严格大于或严格小于前后节点,等于的情况不算临界点。
  • 位置计数:位置从0开始计数还是从1开始计数不影响结果,因为距离是相对值。
  • 最小距离初始化:初始化为INT_MAX,确保能找到真正的最小值。
  • 临界点数量:如果临界点少于2个,无法计算距离,直接返回[-1, -1]。
http://www.dtcms.com/a/513671.html

相关文章:

  • 静海网站建设手机网站seo怎么做
  • 开了个网站用年份做名字好吗手机做网站多少钱
  • 泉州建设网站的公司做会计要看什么关注什么网站
  • 上海网站论坛建设广东 网站建设
  • 寿宁建设局网站简单的英文网站源码
  • 网站的兼容性柬埔寨做网站网站
  • 模板企业快速建站宜春网站开发
  • wordpress留白seo 工具
  • C++ long long 类型深度解析:大整数处理的基石
  • 怎么用dw做地图网站电脑网络服务在哪里
  • 杭州设计企业网站高端公司腾讯企业邮箱登录入口电脑版
  • 郑州网站建设排行下面哪一项不属于网络营销方式
  • 理聪网营销型网站建设网页图片无法另存为
  • 网站做建筑三维图网址大全浏览器app
  • 网站备案时间wordpress与dede哪个好用
  • 外贸那些网站好用北京单位网站建设培训
  • C++之智能指针
  • 【Threejs-sdk】使用 mogl.js 创建灯光与Hdr:Lighting HDR
  • 兼职做ppt是哪个网站好做网站关键字
  • 网站的网站搭建手机微信管理系统
  • 函数式接口
  • 哪些网站建设公司阿凡达营销网站
  • 网站怎么做sem写作挣钱的网站
  • 三网合一网站建设河南建设工程信息网 建议访问中项网
  • 东圃手机网站建设电话西安做网站选哪家好
  • 查询网站后台登陆地址做pc端网站教程
  • 德清网站制作实力网站优化公司首选
  • [人工智能-大模型-32]:大模型应用层技术栈 - 智能决策层(AI Agent)- 搭建实例
  • wordpress导航类网站旅游景区网站建设规划
  • 校园类网站模板免费下载怎么让网站被收录