100天iOS数据结构与算法实战 Day07 – 栈的算法实战 Min Stack
题目描述
设计一个栈支持push, pop, top,并且检索最小元素在恒定时间内。
-
push(x) – 将元素x推入堆栈。
-
pop() – 删除堆栈顶部的元素。
-
top() – 获取顶部元素。
-
getMin() – 检索堆栈中的最小元素。
思路灵感图
主要代码
-
- (void)push
id)object
-
{
-
//1
-
if ([_stack isEmpty])
-
{
-
[_stack push:[NSNumber numberWithInteger:[object integerValue]]];
-
[_minStack push:[NSNumber numberWithInteger:[object integerValue]]];
-
-
}
-
else
-
{
-
//2
-
[_stack push:[NSNumber numberWithInteger:[object integerValue]]];
-
//3
-
NSNumber *minObj;
-
NSComparisonResult r = [[_stack peek] compare:[_minStack peek]];
-
-
if (r == NSOrderedAscending)
-
{
-
minObj = [_stack peek];
-
-
}
-
else if(r == NSOrderedSame)
-
{
-
minObj = [_minStack peek];
-
-
}
-
else if(r == NSOrderedDescending)
-
{
-
minObj = [_minStack peek];
-
}
-
-
[_minStack push:minObj];
-
-
}
-
}
代码思路解释
要求O (1)时间复杂度获取最小元素,我们借助一个辅助栈来实现。
1. 如果栈为空,则stack 和 minStack 都把这个元素进栈。
2. 如果栈不为空,则stack先吧这个元素进栈。
3. minStack的栈顶最小元素和这个元素对比,小于等于者进minStack。
总结:每次把最小者进minStack,这样minStack就是一个有序的栈,而栈顶元素就是最小元素,我们还可以根据这个思路实现找到最大元素。这个思路牺牲了空间。其实还有更好的办法,用O(1)时间和O(1)的额外辅助空间实现,这里就留给读者思考了。
交流群昵称:ios-Swift/Object C开发上架
交流群号: 869685378 找ios马甲包开发者合作,有兴趣请添加Q 51259559
-
100天iOS数据结构与算法实战 Day01
-
100天iOS数据结构与算法实战 Day02 – 栈
-
100天iOS数据结构与算法实战 Day03 – 栈的算法实战 Valid Parentheses
-
100天iOS数据结构与算法实战 Day04 – 栈的算法实战 逆波兰表示法
-
100天iOS数据结构与算法实战 Day05 – 栈的算法实战 Evaluate Reverse Polish Nota
-
100天iOS数据结构与算法实战 Day06 – 栈的算法实战 Simplify Path