我刚被问到A公司的面试问题如下:
问题: 设计一个数据结构,您可以在其中进行3次操作,推送,弹出并找到最小值。您应该在恒定时间内完成所有3个操作。
我的答案:我会使用一个链接列表,我可以在常规时间内插入和删除,我会使用额外的内存来存储最小值。 < / p>
他想出了第二个问题,如果你弹出最低限度,你怎么找到第二个最小值?再次,在恒定的时间。
你会告诉他什么?
答案 0 :(得分:10)
来自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)