Leetcode2058 找出临界点之间的最小和最大距离

一、问题描述

二、解题思路

本题的思路比较明显,可以使用模拟的方法来解决这个问题。

(1)首先,遍历链表,记录极大值点和极小值点的下标,将其按顺序放入Index向量中;

(2)链表遍历完毕后检查Index向量:

<1>如果Index.size()<2,直接返回{-1,-1};

<2>否则,查找minDistance和maxDistance,再返回;

(3)maxDistance等于Index.back()-Index0,minDistance需要遍历Index向量,寻找相邻两个元素最小的差值(贪心)。**其实可以加一点小小的优化,如果minDistance已经为1了,那就不用再查找了。**最后返回{minDistance,maxDistance}即可。

三、代码实现

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> Index;
        int index=0;
        ListNode * cur=head->next;
        ListNode * front=head;
        ListNode * behind=nullptr;
        while((cur!=nullptr)&&(cur->next!=nullptr)){
            index++;behind=cur->next;
            if(front->val>cur->val&&behind->val>cur->val) Index.push_back(index);
            else if(front->val<cur->val&&behind->val<cur->val) Index.push_back(index);
            front=cur;cur=cur->next;
        }
        //特殊情况处理
        if(Index.size()<2) return {-1,-1};
        //最大距离
        int maxDistance=Index.back()-Index[0];
        int minDistance=INT_MAX;
        for(int i=0;i!=Index.size()-1;i++){
            minDistance=min(minDistance,Index[i+1]-Index[i]);
        }
        return {minDistance,maxDistance};
    }
};
相关推荐
华华哥202224 分钟前
《模型不玄学》第25章 双头模型:共享底座 + 两个分支
算法
王老师青少年编程31 分钟前
2026年山东省小学组【信息学体验营】复赛真题及题解T2:小兔子爬楼梯
c++·真题·山东省·csp·信奥赛·复赛·信息学体验营
Yfhonier34 分钟前
6441. 特别的除法
c++·算法
华华哥202238 分钟前
《模型不玄学》第5章 看懂你的数据:先认字段,再过门禁
算法
国科安芯41 分钟前
低轨卫星姿轨控系统中抗辐射MCU的选型依据与工程实践
单片机·嵌入式硬件·算法·架构·系统安全·低轨卫星·抗辐射
高亦真1 小时前
今天是学习嵌入式的第33天
linux·学习·算法
OPEN-F1 小时前
C++17新特性精讲:结构化绑定、if constexpr与实用类型
开发语言·c++
CoderYanger1 小时前
A.每日一题:3345. 最小可整除数位乘积 I
java·数据结构·程序人生·算法·leetcode·面试·学习方法