自定义数据结构,用于推送,弹出和查找最小值

时间:2011-05-23 21:30:09

标签: algorithm data-structures

我刚被问到A公司的面试问题如下:

问题: 设计一个数据结构,您可以在其中进行3次操作,推送,弹出并找到最小值。您应该在恒定时间内完成所有3个操作。

我的答案我会使用一个链接列表,我可以在常规时间内插入和删除,我会使用额外的内存来存储最小值。 < / p>

他想出了第二个问题,如果你弹出最低限度,你怎么找到第二个最小值?再次,在恒定的时间。

你会告诉他什么?

5 个答案:

答案 0 :(得分:10)

最小堆栈问题 - http://courses.csail.mit.edu/iap/interview/Hacking_a_Google_Interview_Practice_Questions_Person_A.pdf

来自PDF:

问题:最小筹码

描述支持“push”,“pop”和“find minimum”的堆栈数据结构 操作。 “查找最小值”返回堆栈中的最小元素。

好答案:存储两个堆栈,其中一个堆栈包含堆栈中的所有项目 其中一个是一堆最小值。要推动元素,请将其推到第一个元素上 堆。检查它是否小于第二个堆栈的顶部项目;如果是这样,推 它到第二个堆栈上。要弹出项目,请从第一个堆栈弹出它。如果它是顶部 第二个堆栈的元素,从第二个堆栈弹出它。找到最低限度 element,只需返回第二个堆栈顶部的元素。每次操作 花费O(1)时间。

答案 1 :(得分:9)

如果你像你说的那样做链接列表,但也存储当前的最小值。当您添加新数字时,它会查看前一个最小值,并在当前值较低时将当前最小值更改为当前值。

E.g ...假设您有数据:3,6,4,2,7,1。这就是列表的样子

值| min

3 | 3 - &gt; 6 | 3 - &gt; 4 | 3 - &gt; 2 | 2 - &gt; 7 | 2 - &gt; 1 | 1

当你添加/删除项目时,它会跟踪分钟。

编辑: 我提到倒退,它会是这样的: 1 | 1 - &gt; 7 | 2 - &gt; 2 | 2 - &gt; 4 | 3 - &gt; 6 | 3 - &gt; 3 | 3 然后你就不需要“页脚”。

答案 2 :(得分:4)

让每个节点保持对先前最小项的另一个引用。因此,当您弹出最小的项目时,您可以恢复以前最小的项目。因为你只能推送它会是正确的节点。

答案 3 :(得分:3)

这是实现Bryce Siedschlaw给出的上述算法的C代码:

#include<stdio.h>
#include<stdlib.h>

#define minimumOf(a,b) (a<b) ? a : b;

struct node{
    int data;
    struct node* next;
    int min;
};

void push(struct node **head_ref, int new_data){
    struct node* new_node = (struct node *)malloc(sizeof(struct node));
    new_node->data = new_data;

    if(*head_ref == NULL)
        new_node->min = new_data;
    else
        new_node->min = minimumOf(new_data,(*head_ref)->min);

    new_node->next = *head_ref;
    *head_ref = new_node;
}

int minimum(struct node *head){
    return head->min;
}

int pop(struct node **head_ref){
    int pop_data = (*head_ref)->data;
    (*head_ref) = (*head_ref)->next;
    return pop_data;
}

void printList(node *head){
    while(head != NULL){
        printf("%d->", head->data);
        head = head->next;
    }
    printf("\b\n");
}

int main(){
    struct node* a = NULL;

    push(&a, 100);
    push(&a, 24);
    push(&a, 16);
    push(&a, 19);
    push(&a, 50);
    printList(a);
    printf("Minimum is:%d\n", minimum(a));
    printf("Popped:%d\n",pop(&a));
    printf("Minimum is:%d\n", minimum(a));
    printf("Popped:%d\n",pop(&a));
    printf("Minimum is:%d\n", minimum(a));
    printf("Popped:%d\n",pop(&a));
    printf("Minimum is:%d\n", minimum(a));
    printf("Popped:%d\n",pop(&a));
    printf("Minimum is:%d\n", minimum(a));
}

答案 4 :(得分:-2)