問題:如何實現一個棧的方法,它能夠返回棧的最小值且時間複雜度爲O(1)。今天我們來說說幾種解決問題的方式。
結合棧的數據結構和先入後出的特點,如果想實現複雜度爲O(1)的取最小值的方法,就要把最小值保存起來。而且還要隨着出棧,入棧的進行,不斷的更新最小值。下面介紹一下我想到的幾種方法
解法1
思路:每次入棧和出棧同時操作兩個元素,下面的元素是需要入棧的元素,上面的元素是整個棧的最小元素。
在入棧之前先獲取棧頂元素,也就是入棧之前的最小元素。將當前最小元素和入棧的元素比較,如果入棧的元素更小,則最小元素爲入棧元素,如果入棧元素大於當前最小元素,則最小元素不變。
下面就用js數組來實現這樣一個棧。
var stack = {
//用數組存儲元素
items: [],
//實現入棧方法 add
add: function (element) {
//如果數組內沒有元素,則最小元素就是入棧的元素
if (stack.items.length === 0) {
stack.items.push(element)
stack.items.push(element)
} else {
//獲取當前最小元素
var minElement = stack.getMinElement()
if (element < minElement) {
minElement = element
}
stack.items.push(element)
stack.items.push(minElement)
}
},
//實現出棧的方法
remove: function () {
stack.items.pop()
return stack.items.pop()
},
//獲取最小值方法
getMinElement: function () {
if (stack.items.length === 0) {
return null
} else {
return stack.items[stack.items.length-1]
}
}
}
測試結果:
解法2
思路:同時維護兩個棧, 一個用來存儲元素,另一個來存儲最小值。兩個棧同步更新,這樣就能實現獲取最小值的功能。
var stack = {
//用數組存儲元素
items: [],
mins: [],
//實現入棧方法add
add: function(element) {
//如果數組內沒有元素,則最小元素就是入棧的元素
if (stack.items.length === 0) {
stack.items.push(element)
stack.mins.push(element)
} else {
// 獲取當前最小值
var minElement = stack.getMinElement()
if (element < minElement) {
minElement = element
}
stack.items.push(element)
stack.mins.push(minElement)
}
},
//實現出棧的方法
remove: function() {
stack.mins.pop()
return stack.items.pop()
},
getMinElement: function() {
if (stack.items.length === 0) {
return null
} else {
return stack.mins[stack.mins.length-1]
}
}
}
測試結果: