①环形链表
给定一个链表,判断链表中是否有环。
1.使用快慢指针,一个走两步,一个走一步,判断能否相撞,如果相撞则说明有环:
class Solution {
public:
//快慢指针的应用
bool hasCycle(ListNode *head) {
ListNode *fast = head;
ListNode *slow = head;
while (fast != NULL && fast->next != NULL)
{
fast = fast->next->next; //快指针走两步
slow = slow->next; //慢指针走一步
if (fast == slow) //判断是否相撞,相撞则说明有环
return true;
}
return false;
}
};
②最小栈
设计一个支持 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.
1.使用两个栈,一个栈用来顺序存储push进来的数据,另一个存储出现过的最小值:
具体分析:
若push入栈-2,0,-3
则push操作之后s1栈中元素为-2,0,-3
s2栈中元素为-2,-3
此时getMin()操作得到s2栈顶元素-3即为元素最小值
经pop操作,比较s1栈顶元素与s2栈顶元素是否相同,如果相同则将两个栈中的栈顶元素都出栈,否则s1栈顶元素出栈
此时top操作得到0
最后getMin操作得到栈s2中栈顶元素-2,即为最小值
class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
s1.push(x); //s1保存顺序push的元素
if (s2.empty() || x <= s2.top()) //s2保存出现过的最小值
s2.push(x);
}
void pop() {
if (s1.top() == s2.top()) //如果顺序保存的值与s2中保存的值相等,说明s2中保存的值不是最小值,弹出栈
s2.pop();
s1.pop();
}
int top() {
return s1.top(); //返回s1顺序保存的栈顶元素
}
int getMin() {
return s2.top(); //返回s2中得到的最小值
}
private:
stack<int> s1,s2; //s1保存顺序push的值,s2保存出现过的最小值
};
2.使用一个栈保存顺序push的值,另设一个变量(min_val)存储最小值,具体思路与两个栈的思路差不多,只不过将代码修改一下:
具体分析:
若push入栈为-2,0,-3
则push操作之后栈元素为INT_MAX--(-2)--0--(-2)--(-3)
此时min_val = -3,同时getMin()操作得到最小值-3
经pop操作,此时栈顶元素-3被弹出栈与最小值比较,与最小值相等则将此时的栈顶元素(-2)赋給最小值,同时栈顶元素(-2)出栈
此时栈顶元素为0,则top操作输出为0
此时在getMin()操作得到当前最小值(-2)
class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
min_val = INT_MAX; //初始化最小值min_val为int所能表示的最大值
}
void push(int x) {
if (x <= min_val) //如果x小于当前最小值则将最小值入栈
{
s1.push(min_val);
min_val = x;
}
s1.push(x); //将当前x值入栈
}
void pop() {
int t = s1.top(); //取出栈顶元素
s1.pop();
if (t == min_val) //将栈顶元素与最小值比较,如果一致则将此时的栈顶元素赋給min_val,同时将当前栈顶元素弹出
{
min_val = s1.top();
s1.pop();
}
}
int top() {
return s1.top(); //得到栈顶元素
}
int getMin() {
return min_val;
}
private:
int min_val; //存储最小值
stack<int> s1; //保存顺序push的值
};