长度最小的子数组

    技术2025-06-23  12

    给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

    typedef int type; //定义队列数据类型 struct QueueNode { int data; struct QueueNode *next; }; // end(移除端) ---> Node -next> Node -next> Node <--- first(插入端) struct Queue { struct QueueNode *first; struct QueueNode *end; int num; }; struct Queue* QueueCreat() { struct Queue *my_queue; my_queue = (struct Queue*)malloc(sizeof(struct Queue)); //出错未封装 my_queue->first = NULL; my_queue->end = NULL; my_queue->num = 0; return my_queue; } void QueueAddNode(struct Queue* queue, type data) { struct QueueNode *my_queuenode; my_queuenode = (struct QueueNode*)malloc(sizeof(struct QueueNode)); if(queue->first != NULL) { queue->first->next = my_queuenode; } else { queue->end = my_queuenode; } my_queuenode->next = NULL; my_queuenode->data = data; queue->first = my_queuenode; queue->num ++; } void QueueRmvNode(struct Queue* queue) { struct QueueNode *node; if(queue->end == NULL) { return; } node = queue->end; queue->end = queue->end->next; if(!(--queue->num)) { queue->first = NULL; } free(node); } int minSubArrayLen(int s, int* nums, int numsSize){ struct Queue *my_queue = QueueCreat(); unsigned int i, sum = 0, min = 0, flag = 0; for(i = 0; i < numsSize; i++) { QueueAddNode(my_queue, *(nums+i)); sum += *(nums+i); if(sum >= s && min == 0) { min = my_queue->num; flag = 1; } while(sum - (my_queue->end->data) >= s) { sum -= my_queue->end->data; QueueRmvNode(my_queue); if(!flag) { flag = 1; min = (my_queue->num); } } if(flag) { min = min < (my_queue->num) ? min : (my_queue->num); } } if(sum >= s && min == 0) { min = my_queue->num; } return min; }
    Processed: 0.009, SQL: 9