一、最小栈
1、题目
设计一个支持
push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。实现
MinStack
类:
MinStack()
初始化堆栈对象。void push(int val)
将元素val推入堆栈。void pop()
删除堆栈顶部的元素。int top()
获取堆栈顶部的元素。int getMin()
获取堆栈中的最小元素。
示例 1:
输入: ["MinStack","push","push","push","getMin","pop","top","getMin"] [[],[-2],[0],[-3],[],[],[],[]] 输出: [null,null,null,null,-3,null,0,-2] 解释: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin(); --> 返回 -2.
2、思路
此题主要是要返回栈中的最小值,需要另外设计一个最小值的栈,与原始栈同步进行存储等操作,首先初始化时将最小栈先输入一个最大值(Integer.MAX_VALUE表示int数据类型的最大取值数:2 147 483 647),然后压入栈中时原始栈正常入栈,最小栈需要比较栈顶与输入值的大小,压入小的一个,以实现二者的同步进行,抛出栈时二者都抛出栈顶,取栈顶时取原始栈顶,获取最小值时只需获取最小值栈的栈顶。
3、代码
class MinStack {
Deque<Integer> sStack;
Deque<Integer> minStack;
public MinStack() {
sStack = new LinkedList<Integer>();
minStack = new LinkedList<Integer>();
minStack.push(Integer.MAX_VALUE);
}
public void push(int val) {
sStack.push(val);
minStack.push(Math.min(minStack.peek(),val));
}
public void pop() {
sStack.pop();
minStack.pop();
}
public int top() {
return sStack.peek();
}
public int getMin() {
return minStack.peek();
}
}
4、复杂度分析
时间复杂度:O(1)
空间复杂度:O(n)
二、链表中倒数第k个节点
1、题目
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2. 返回链表 4->5.
2、思路
本题使用双指针结构,首先设计两个指针,一快一慢,快指针先走k步,慢指针不变,然后同步走,当快指针走完,慢指针则指向倒数第k个。
3、代码
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode former = head;
ListNode latter = head;
for(int i = 0; i < k; i++){
former = former.next;
}
while(former != null) {
former = former.next;
latter = latter.next;
}
return latter;
}
}
4、复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)