題目:對現在的Stack(棧)數據結構進行改進,加一個min()功能,使之能在常數,即O(1),時間內給出棧中的最小值。可對push()和pop()函數進行修改,但要求其時間複雜度都只能是O(1)。
分析:要使pop,push,min都是O(1),所以肯定要犧牲點空間
思路:1:在stack的數據結構中加兩個個字段,如
typedef struct {
int data[MAX];
int top;
int min;
int second;
}stack;
pop,push的時候都去棧頂元素,所以是O(1)
min的時候取stack的min字段,所以也是O(1)
每次push的時候進行比較,如果當前push的元素比stack->min小,則用當前元素替換stack->min,用原來的min替換second。如果當前push的元素比stack->min大,但比second小,則用當前元素替換stack->second。於是達到了取min的效果,程序如下
int push(stack * s,int x){
ASSERT(s!=NULL);
if(s->top>=MAX)
{
printf("Stack overload!");
return -1;
}
s->data[s->top++]=x;
if(x<s->min)
s->min=x;
return 0;
}
每次pop的時候進行比較,如果pop的元素爲min,則用second替換min。於是達到了取min的效果,程序如下
int pop(stack *s,int *x)
{
ASSERT(s!=NULL);
if(s->top<=0)
{
printf("Stack Empty!");
return -1;
}
(*x)=s->data[s->top--];
if(x==s->min) s->min=s->second;
return 0;
}
int min( stack *s,int *x )
{
ASSERT(s!=NULL);
(*x)=s->min;
return 0;
}
思路2:設置輔助棧ass,記錄每個狀態下的最小值,每次插入時,得到輔助棧當前值,和插入的值比較
如果小則插入到最小值棧的就是它,否則就是原來的最小值,通過這種方式,pop,push,min三個都是
O(1)算法的。
typedef struct {
int data[MAX];
int top;
}stack;
STATIC int push_stack(stack *s,int x)
{
ASSERT((s!=NULL));
if(s->top>=MAX)
{
printf("Stack overload");
return -1;
}
s->data[s->top++]=x;
return 0;
}
STATIC int pop_stack(stack *s,int *x)
{
ASSERT(s!=NULL);
if(s->top<=0)
{
printf("Stack Empty");
return -1;
}
(*x)=s->data[s->top--];
return 0;
}
int push(stack *main,stack *ass,int x)
{
ASSERT((main!=NULL)&&(ass!=NULL));
int temp;
pop_stack(ass,&temp);
push_stack(main,x);
if(x<temp)
{
push_stack(ass,temp);
push_stack(ass,x);
}
else
{
push_stack(ass,temp);
push_stack(ass,temp);
}
return 0;
}
int pop(stack *main,stack *ass,int *x)
{
ASSERT((main!=NULL)&&(ass!=NULL));
int temp;
pop_stack(ass,&temp);
pop_stack(main,x);
return 0;
}
int min(stack *ass,int *x)
{
ASSERT((main!=NULL)&&(ass!=NULL));
pop_stack(ass,x);
push_stack(ass,(*x));
return 0;
}
Google面試題(六)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.