タイトル
スタックデータ構造定義は、スタックのこのタイプは、スタック内のMIN関数最小要素、コール分、プッシュとポップ時間複雑度はO(1)であることができる器具。
例:
分のありがとう分のおかげ=新しい分おかげで();
minStack.push(-2)。
minStack.push(0)。
minStack.push(-3)。
minStack.min(); - >返回-3。
minStack.pop();
minStack.top(); - >返回0
minStack.min()。- >返回-2。
注:コールの合計数は、各関数が20000回を超えていません
出典:滞在ボタン(LeetCode)
リンクします。https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof
問題解決のためのアイデア
暴力:分は、その後の最小値を見つけるために、コールスタックを横断し、ここでは、対象の要件ではなく、デモを満たしていません。
スタック
-
特徴:最後のアウト
-
この方法のタイトルを実装する必要があります
- プッシュ():アレイの端部に1つ以上の金属元素(スタックにプッシュ)を追加します
- トップ():最後の要素(トップ要素)の配列を返しますではなく、スタック内の
- ポップ():配列(スタックから最上位要素)で最後の要素を削除します
問題解決
スタックは、最小機能が含まれ、実際には、最小スタックが返される呼び出し、より多くの方法の分スタックを超えています。
それは小さい値に補助記憶スタックを追加するだけで、コール分()補助スタックを返す最小スタックトップです。
コード
- 実行時間:24ミリ - 消費メモリ:8.5メガバイト
type MinStack struct {
nums []int //储存栈
min []int //辅助储存栈,存储最小值
}
/** initialize your data structure here. */
func Constructor() MinStack {
return MinStack{
make([]int,0,3),
make([]int,0,3),
}
}
func (this *MinStack) Push(x int) {
this.nums=append(this.nums,x)
if len(this.min)==0{
this.min=append(this.min,x)
}else if this.min[len(this.min)-1]<x{
this.min=append(this.min,this.min[len(this.min)-1])
}else{
this.min=append(this.min,x)
}
}
func (this *MinStack) Pop() {
this.nums=this.nums[:len(this.nums)-1]
this.min=this.min[:len(this.min)-1]
}
func (this *MinStack) Top() int {
return this.nums[len(this.nums)-1]
}
func (this *MinStack) Min() int {
return this.min[len(this.min)-1]
}
/**
* Your MinStack object will be instantiated and called as such:
* obj := Constructor();
* obj.Push(x);
* obj.Pop();
* param_3 := obj.Top();
* param_4 := obj.Min();
*/
LeetCodeでこの質問、私は、説明を提出しなければならないビューへようこそ。ニックネーム:さくら。