棧在O 1 時間內求min值

2021-08-16 21:10:46 字數 1943 閱讀 9986

實現乙個棧stack,要求實現push(出棧)、pop(入棧)、min(返回最小值的操作)的時間複雜度為o(1)

思路:1:在stack的資料結構中加兩個個字段,如 

typedef struct 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) 

s->data[s->top++]=x;  // push

的基本功能,把

x壓入棧,棧頂元素的位置自增

1if(x < s->min)  // 如果新壓入的x比當前min小,則替換min

s->second = s->min; 

s->min=x; 

else if(x< s->second) // 

否則,如果x還比

second

小,這替換

second

s->second= x;

// 否則,

min和

second

都不變return 0; 

} 每次

pop的時候進行比較,如果

pop的元素為

min,則用

second

替換min

(這裡用到了

second

)。於是達到了取

min的效果,程式如下 

int pop(stack *s,int *x) 

(*x) =s->data[s->top--];   // pop

的基本功能,把

x出棧,棧頂元素的位置自減

1if(x==s->min)  // 如果x

正好等於

min,那麼就要把

second

給min

s->min=s->second; 

return 0; 

} int min( stack *s,int *x ) 

思路2:設定輔助棧ass,記錄每個狀態下的最小值,每次插入時,得到輔助棧當前值,和插入的值比較

如果小則插入到最小值棧的就是它,否則就是原來的最小值,通過這種方式,pop,push,min三個都是

o(1)演算法的。 

如果還需要求最大值,那麼就另外再設定乙個ass2來記錄當前棧的最大值。

typedef struct stack; 

static int push_stack(stack *s,int x) 

s->data[s->top++]=x; 

return 0; 

} static int pop_stack(stack *s,int *x) 

(*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

棧在o(1)時間內求min值

標籤:棧

資料結構

最小值o1

在O 1 時間內刪除鍊錶節點

題目 給定單向鍊錶的頭指標和乙個節點指標,定義乙個函式在o 1 的時間刪除該節點。struct listnode void deletenode listnode plisthead,listnode ptobedeleted 演算法思路 一般我們是從頭節點開始遍歷,知道找到要刪除的節點的前面乙個節...

在 O 1 時間內刪除鍊錶節點

解題思路 如果該節點不是尾節點,那麼可以直接將下乙個節點的值賦給該節點,然後令該節點指向下下個節點,再刪除下乙個節點,時間複雜度為 o 1 如果鍊錶只有乙個節點,那麼直接 否則,就需要先遍歷鍊錶,找到節點的前乙個節點,然後讓前乙個節點指向 null,時間複雜度為 o n 綜上,如果進行 n 次操作,...

在O 1 時間內刪除鍊錶節點

from acwing 28 time limit 1s memory limit 64mb problem description 給定單向鍊錶的乙個節點指標,定義乙個函式在o 1 時間刪除該結點。假設鍊錶一定存在,並且該節點一定不是尾節點。sample 輸入 鍊錶 1 4 6 8 刪掉節點 第2...