设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) -- 将元素 x 推入栈中。
pop() -- 删除栈顶的元素。
top() -- 获取栈顶元素。
getMin() -- 检索栈中的最小元素。
示例:
MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin(); --> 返回 -2.
上期的问题是:141, 环形链表
1public boolean hasCycle(ListNode head) {
2 if (head == null) return false;
3 ListNode walker = head;
4 ListNode runner = head;
5 while (runner.next != null && runner.next.next != null) {
6 walker = walker.next;
7 runner = runner.next.next;
8 if (walker == runner) return true;
9 }
10 return false;
11}
解析:
这个基本上就比较简单了,就是使用两个指针一个快一个慢,当他们相遇的时候就说明有环,否则就是无环,这个直接想可能不太容易,画个图就很容易看明白了,这里的有环有两种情况,一种是0型的有环,一种是6型的有环,0型的有环很简单,我们这里说的是6型的。这里我们还可以找到环的起点,当快慢指针相遇的时候,这时候在用一个指针从head开始并且和之前相遇的慢指针同时开始,每次走一步,当他们相遇的时候就是环的起点,有兴趣的可以自己尝试着写一下,这里就不在过多叙述。我们再来看另一种写法
1public boolean hasCycle(ListNode head) {
2 if (head == null || head.next == null) return false;
3 if (head.next == head) return true;
4 ListNode nextNode = head.next;
5 head.next = head;
6 return hasCycle(nextNode);
7}
这个其实也很容易理解,就是把当前的节点一个个删除,如果没环直接就删完了,如果有环,那么环的起点会有两个指针指向他,删到最后肯定是自己指向自己。这种方式会破坏链表的结构,但题目中也没说不准破坏链表结构,所以这种方式也是可以的。