JAVA数据结构-比较难的栈算法问题

Mourinho 2011-06-18 09:19:29
1.实现类似栈的数据结构(数据类型可以只为Integer),包含push(),pop(),findMin()3个方法,其中findMin()是输出当前数据结构中最小元素的值。
注意:所有的方法时间复杂度必须为O(1)!!!即不能使用循环遍历的方法找出最小值!!!

2.使用1个数组实现3个栈。当且仅当数组被全部填满时,才能抛出栈溢出异常。也就是说,数组有空间时,可以支持任意栈的push()操作。

第1个问题我已经解决了,欢迎大家来探讨,看看有没有更好的解法。我是用伴随矩阵做的。
第2个问题实在不会,求大牛解决。有木有?
...全文
392 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mourinho 2011-06-23
  • 打赏
  • 举报
回复
自己再顶一下!
「已注销」 2011-06-21
  • 打赏
  • 举报
回复
qybao 2011-06-21
  • 打赏
  • 举报
回复
2
尝试了一下,一个数组还是不行。
有时间再想想。
qqlwq123 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 zyc13701469860 的回复:]

引用 25 楼 lacus87 的回复:

第一题为啥不能直接用一个值记录最小值或者最小值的位置QQ


如果把最小值pop出来,剩下的元素怎么求用O(1)求最小值?
[/Quote]
我的方法就是用1个值记录下来,pop后一样可以一步找出下一个最少值的位置啊
Mourinho 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 lacus87 的回复:]

第一题为啥不能直接用一个值记录最小值或者最小值的位置QQ
[/Quote]

如果把最小值pop出来,剩下的元素怎么求用O(1)求最小值?
Mourinho 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 qybao 的回复:]

问题2

可以考虑每个stack有个id和topIndex和size和flag表示已满,操作一个static的int[],每次push或pop的时候,通过id,toIndex,size,flag来计算实际int[]的下标
比如第1个stack,id是1,每次push,pop取数组下标 0, 3, 6,... 即topIndex=id-1,topIndex+=3
第2个stack,id是……
[/Quote]
这个方法可能不合题意,假设数组长度为10,那么3个栈可以分别存储a,b,c个元素,只要满足a+b+c =10就可以
Mourinho 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 xiaolinyouni 的回复:]

╔═╤═╤═╤═╤═╗
║ │ │ │0│结║
║ │ │ │0│贴║
║ │ │ │%│率║
║ │ │ │ │0║
║ │ │ │ │.║
╚═╧═╧═╧═╧═╝
[/Quote]
蛋疼啊,我连这个才发了2个帖子,而且上个帖子的回答基本是坑爹的。想结贴还不容易?
苦苦的潜行者 2011-06-20
  • 打赏
  • 举报
回复
╔═╤═╤═╤═╤═╗
║ │ │ │
║ │ │ │
║ │ │ │
║ │ │ │ │
║ │ │ │ │
╚═╧═╧═╧═╧═╝
Mourinho 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ticmy 的回复:]

楼主你的实现里用了好多数组啊,不符合题目的一个数组的要求啊
[/Quote]
可能是我的描述有点问题。
题目的意思是必须将所有栈的元素存放在同一个数组中,但是可以指定栈元素对应的数组元素下标(存放在数组或者是其他数据结构中),否则没法对指定栈进行push,pop操作。
Mourinho 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 chenchenyangll 的回复:]

引用 10 楼 alexandertech 的回复:

引用 7 楼 zyc13701469860 的回复:

引用 5 楼 alexandertech 的回复:

第一题你用了两个数组,其中一个专用于保存当前最小值
可以只用一个数组来实现:
数组中永远把一个最小值的拷贝放在栈底


不是哦,我的那个数组存放的是最小值的序列。
不能存放当前最小值,因为在pop()弹出最小……
[/Quote]

我没去找最小值啊,在push的时候生成了最小元素的子序列,存放在一个数组中。
如:2,-1,0,1,3,2,-2,1,-2
数组依次存放2,-1,0,-2,-2
在pop的时候,如果弹出元素和最小子序列数组最大下标所在元素相等,最小子序列数组长度-1
如pop -2,1,-2,
数组为2,-1,0,-2
2,-1,0,-2
2,-1,0
此时最小值为0,不需要遍历
飞跃颠峰 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zyc13701469860 的回复:]
这个问题我想过,如果存放2个栈,你的方法是最优解。
但是对于3个栈,也没必要通过移动数组元素来实现吧。而且我的时间复杂度是O(1),可以支持n个栈同时存储。

[/Quote]

问题是题目里明确说了使用1个数组来实现
飞跃颠峰 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 chenchenyangll 的回复:]


[/Quote]

你说的对,我没有考虑到pop()
Mourinho 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 alexandertech 的回复:]

问题2
你用了三个数组来实现,窃以为与题意不合。
本题并未要求时间复杂度,应该是考察合理利用空间的能力。
如果能用3个数组,直接用3个数组代表三个栈就好了。

我觉得最好的方法应该是这样:
假设数组长度为n
栈1从数组下标0开始逐渐递增下标,栈2把顺序反过来,从下标n-1开始逐渐递减下标,这样这两个栈的元素永远不需要被移动。
栈3从数组下标n/3开始,根据需要栈3可能需要被移动。……
[/Quote]
这个问题我想过,如果存放2个栈,你的方法是最优解。
但是对于3个栈,也没必要通过移动数组元素来实现吧。而且我的时间复杂度是O(1),可以支持n个栈同时存储。
Spring源码解析 2011-06-20
  • 打赏
  • 举报
回复
路过,接分
chenchenyangll 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 alexandertech 的回复:]

引用 7 楼 zyc13701469860 的回复:

引用 5 楼 alexandertech 的回复:

第一题你用了两个数组,其中一个专用于保存当前最小值
可以只用一个数组来实现:
数组中永远把一个最小值的拷贝放在栈底


不是哦,我的那个数组存放的是最小值的序列。
不能存放当前最小值,因为在pop()弹出最小值的时候,需要重新遍历数组找当前的最小值。那么时间复杂度上升……
[/Quote]

LZ回答你的就是这个啊

比如按你说的 -1 0 2 -1
pop的时候-1弹出,你怎么去找下一个最小值呢?
飞跃颠峰 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zyc13701469860 的回复:]

引用 5 楼 alexandertech 的回复:

第一题你用了两个数组,其中一个专用于保存当前最小值
可以只用一个数组来实现:
数组中永远把一个最小值的拷贝放在栈底


不是哦,我的那个数组存放的是最小值的序列。
不能存放当前最小值,因为在pop()弹出最小值的时候,需要重新遍历数组找当前的最小值。那么时间复杂度上升为O(N),不符合题意O(1)。
如:2,-1,3,-2 ……
[/Quote]

可能我的表达有点问题,最小值的拷贝不是放在栈底,而是放在数组的下标0处,即若栈的空间要求为n,分配给它一个大小为n+1的数组
chenchenyangll 2011-06-20
  • 打赏
  • 举报
回复
原来还有这么一说 学习了
龙四 2011-06-20
  • 打赏
  • 举报
回复
楼主你的实现里用了好多数组啊,不符合题目的一个数组的要求啊
Mourinho 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 alexandertech 的回复:]

第一题你用了两个数组,其中一个专用于保存当前最小值
可以只用一个数组来实现:
数组中永远把一个最小值的拷贝放在栈底
[/Quote]

不是哦,我的那个数组存放的是最小值的序列。
不能存放当前最小值,因为在pop()弹出最小值的时候,需要重新遍历数组找当前的最小值。那么时间复杂度上升为O(N),不符合题意O(1)。
如:2,-1,3,-2 //可以保存-2
但是当-2被弹出时,剩下2,-1,3,那么就要遍历了。
飞跃颠峰 2011-06-20
  • 打赏
  • 举报
回复
问题2
你用了三个数组来实现,窃以为与题意不合。
本题并未要求时间复杂度,应该是考察合理利用空间的能力。
如果能用3个数组,直接用3个数组代表三个栈就好了。

我觉得最好的方法应该是这样:
假设数组长度为n
栈1从数组下标0开始逐渐递增下标,栈2把顺序反过来,从下标n-1开始逐渐递减下标,这样这两个栈的元素永远不需要被移动。
栈3从数组下标n/3开始,根据需要栈3可能需要被移动。
加载更多回复(11)

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧