題目:定義棧的數據結構,請在該類型中實現一個能夠得到棧的最小元素的min函數。在該棧中,調用min、push及pop的時間複雜度都是O(1)。
解題思路:把每次的最小元素都保存起來放到另外一個輔助棧裏。
C#實現方式:
public class StackWithMin { private Stack<int> m_data; private Stack<int> m_min; #region 包含min函數的棧 /// 定義棧的數據結構,請在該類型中實現一個能夠得到棧的最小元素的min函數。 /// 在該棧中,調用min、push及pop的時間複雜度都是O(1). /// public void push(int value) { m_data.Push(value); if (m_min.Count == 0 || value < m_min.Peek()) m_min.Push(value); else m_min.Push(m_min.Peek()); } public void pop() { if (m_data.Count > 0 && m_min.Count > 0) { m_data.Pop(); m_min.Pop(); } } public int min() { Trace.Assert(m_data.Count > 0 && m_min.Count > 0, ""); return m_min.Peek(); } #endregion }
Java實現方式:
public class StackWithMin { private Stack<Integer> m_data; private Stack<Integer> m_min; public void push(int value) { m_data.push(value); if (m_min.size() == 0 || value < m_min.peek()) m_min.push(value); else m_min.push(m_min.peek()); } public int pop() { assert m_data.size() > 0 && m_min.size() > 0 : ""; int value = m_data.pop(); m_min.pop(); return value; } public int min() { assert m_data.size() > 0 && m_min.size() > 0 : ""; return m_min.peek(); } public static void main(String[] args) { // TODO Auto-generated method stub } }
Python實現方式:
class StackWithMin(object): def __init__(self): self._m_data = [] self._m_min = [] def push(self, value): self._m_data.append(value) if len(self._m_min) == 0 or value < self._m_min[-1]: self._m_min.append(value) else: self._m_min.append(self._m_min[-1]) def pop(self): assert len(self._m_min) > 0 and len(self._m_data) > 0 value = self._m_data[-1] self._m_data = self._m_data[:-1] self._m_min = self._m_min[:-1] return value def min(self): assert len(self._m_min) > 0 and len(self._m_data) > 0 return self._m_min[-1]