楼主: 
JIWP (JIWP)   
2024-07-05 18:47:26我只会写粪code了
2058. Find the Minimum and Maximum Number of Nodes Between Critical Points
critical point是指local maxima 或是 local minima
一个node是local maxima那他的value会大于前一个跟下一个node值
一个node是local minima那他的value会小于前一个跟下一个node值
如果node有previos/next node才有可能是local maxima/minima
给一个linked list
请回传任意两个critical point间距离的最大和最小值
如果critical point数量没有超过2个则回传[-1,-1]
思路:
原本想说把所有critcal point都找出来记录在一个array里
不过这样太麻烦了
先找出第一个critical point,并记录其位置
接着开始找接下来的critical point,要记录前一个critical point的位置
每次都去比较两个critical point的距离差是不是比较小
这样就可以找到最短的距离差
最大的距离差则是最后一个和第一个得差值
C code :
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* nodesBetweenCriticalPoints(struct ListNode* head, int* returnSize) {
    int cnt=1,*res=(int*)malloc(2*sizeof(int)),first=0,last=0;
    res[0]=-1;
    res[1]=-1;
    (*returnSize)=2;
    struct ListNode* prev=head;
    head=head->next;
    while(1){
        if (head->next==NULL){
            return res;
        }
        if ((prev->val < head->val && head->next->val < head->val) || (prev->
val > head->val && head->next->val > head->val)){
            first=cnt++;
            prev=head;
            head=head->next;
            break;
        }
        prev=head;
        head=head->next;
        cnt++;
    }
    int prevnum=first,mindist=100001;
    while(1){
        if (head->next==NULL){
            if (mindist==100001){
                return res;
            }
            res[0]=mindist;
            res[1]=last-first;
            return res;
        }
        if ((prev->val < head->val && head->next->val < head->val) || (prev->
val > head->val && head->next->val > head->val)){
            last=cnt;
            mindist = mindist < (cnt-prevnum) ? mindist : (cnt-prevnum);
            prevnum=cnt;
        }
        cnt++;
        prev=head;
        head=head->next;
    }
    return res;
}