創建一個棧,實現取最小值時間複雜度

問題:如何實現一個棧的方法,它能夠返回棧的最小值且時間複雜度爲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]
		}
	}
}
		

測試結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章