怎么在O(1)的时间复杂度下找到数组的最大值?

zhanghaiqiang152527 2014-10-28 08:06:40
一道面试题,写一个栈类,其中有个max()成员函数返回栈中最大元素,要求时间复杂度O(1)?
...全文
1156 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
景语 2014-10-30
  • 打赏
  • 举报
回复
这是CRCI里面讲到的一道题。

参考




最小换成最大,一样的效果。
欢乐的小猪 2014-10-30
  • 打赏
  • 举报
回复
引用 11 楼 mymtom 的回复:
原理上不行吧,需要有序的才行啊
++
赵4老师 2014-10-29
  • 打赏
  • 举报
回复
空间换取时间
  • 打赏
  • 举报
回复
引用 11 楼 mymtom 的回复:
原理上不行吧,需要有序的才行啊
5楼的想法不错
  • 打赏
  • 举报
回复
引用 5 楼 brookmill 的回复:
保存(data_,max_)这样一对的数据。 比如,入栈1 4 2 5 3 实际上保存的是(1,1), (4,4), (2,4), (5,5), (3,5)
这应该是个不错的办法!
mujiok2003 2014-10-29
  • 打赏
  • 举报
回复
引用 5 楼 brookmill 的回复:
保存(data_,max_)这样一对的数据。 比如,入栈1 4 2 5 3 实际上保存的是(1,1), (4,4), (2,4), (5,5), (3,5)
靠谱
常书 2014-10-29
  • 打赏
  • 举报
回复
引用 5 楼 brookmill 的回复:
保存(data_,max_)这样一对的数据。 比如,入栈1 4 2 5 3 实际上保存的是(1,1), (4,4), (2,4), (5,5), (3,5)
正解,如果只用一个栈,最大值可用数组来存,还得保存数组当前索引 如果不用数组,只用一个值保存,每次出入栈都要对所有元素重新计算最大值
mujiok2003 2014-10-29
  • 打赏
  • 举报
回复
引用 9 楼 zhouqinghe24 的回复:
[quote=引用 8 楼 mujiok2003 的回复:] [quote=引用 7 楼 zhouqinghe24 的回复:] [quote=引用 3 楼 mujiok2003 的回复:] [quote=引用 2 楼 zhouqinghe24 的回复:] [quote=引用 1 楼 mujiok2003 的回复:] 每次更行栈的时候,更新成员max_, 而max函数直接返回成员max_
你这个不行。 出栈后 就不能确定是否为最大值了,这个需要借助双栈。[/quote] 每次更新栈包括入栈和出站。[/quote] 出栈遍历一遍就是O(n)了 不是O(1)[/quote] 要求的不是出站吧, 是max?[/quote] 这样的话 可以先都pop 出来,求到max 再push进去,保存max的值,用max 函数来返回这个值。也算O(1)?[/quote] 显然不算, 你对max使用提出额外的要求,max的复杂度是O(n)
zdnexus 2014-10-29
  • 打赏
  • 举报
回复
进栈的时候就用最小堆?-。-
mymtom 2014-10-29
  • 打赏
  • 举报
回复
原理上不行吧,需要有序的才行啊
  • 打赏
  • 举报
回复
5楼不错。。。
火头军 2014-10-28
  • 打赏
  • 举报
回复
栈的底层实现用大顶堆,这样堆顶元素就是最大值
瑞卡哥哥 2014-10-28
  • 打赏
  • 举报
回复
引用 8 楼 mujiok2003 的回复:
[quote=引用 7 楼 zhouqinghe24 的回复:] [quote=引用 3 楼 mujiok2003 的回复:] [quote=引用 2 楼 zhouqinghe24 的回复:] [quote=引用 1 楼 mujiok2003 的回复:] 每次更行栈的时候,更新成员max_, 而max函数直接返回成员max_
你这个不行。 出栈后 就不能确定是否为最大值了,这个需要借助双栈。[/quote] 每次更新栈包括入栈和出站。[/quote] 出栈遍历一遍就是O(n)了 不是O(1)[/quote] 要求的不是出站吧, 是max?[/quote] 这样的话 可以先都pop 出来,求到max 再push进去,保存max的值,用max 函数来返回这个值。也算O(1)?
mujiok2003 2014-10-28
  • 打赏
  • 举报
回复
引用 7 楼 zhouqinghe24 的回复:
[quote=引用 3 楼 mujiok2003 的回复:] [quote=引用 2 楼 zhouqinghe24 的回复:] [quote=引用 1 楼 mujiok2003 的回复:] 每次更行栈的时候,更新成员max_, 而max函数直接返回成员max_
你这个不行。 出栈后 就不能确定是否为最大值了,这个需要借助双栈。[/quote] 每次更新栈包括入栈和出站。[/quote] 出栈遍历一遍就是O(n)了 不是O(1)[/quote] 要求的不是出站吧, 是max?
瑞卡哥哥 2014-10-28
  • 打赏
  • 举报
回复
引用 3 楼 mujiok2003 的回复:
[quote=引用 2 楼 zhouqinghe24 的回复:] [quote=引用 1 楼 mujiok2003 的回复:] 每次更行栈的时候,更新成员max_, 而max函数直接返回成员max_
你这个不行。 出栈后 就不能确定是否为最大值了,这个需要借助双栈。[/quote] 每次更新栈包括入栈和出站。[/quote] 出栈遍历一遍就是O(n)了 不是O(1)
brookmill 2014-10-28
  • 打赏
  • 举报
回复
保存(data_,max_)这样一对的数据。 比如,入栈1 4 2 5 3 实际上保存的是(1,1), (4,4), (2,4), (5,5), (3,5)
brookmill 2014-10-28
  • 打赏
  • 举报
回复
引用 3 楼 mujiok2003 的回复:
[quote=引用 2 楼 zhouqinghe24 的回复:] [quote=引用 1 楼 mujiok2003 的回复:] 每次更行栈的时候,更新成员max_, 而max函数直接返回成员max_
你这个不行。 出栈后 就不能确定是否为最大值了,这个需要借助双栈。[/quote] 每次更新栈包括入栈和出站。[/quote] 出栈的时候更新,需要把整个栈重新扫一遍,效率不太高。 空间换时间,把每次入栈的max_历史记录保存下来,这样出栈更新就很快了。
mujiok2003 2014-10-28
  • 打赏
  • 举报
回复
引用 2 楼 zhouqinghe24 的回复:
[quote=引用 1 楼 mujiok2003 的回复:] 每次更行栈的时候,更新成员max_, 而max函数直接返回成员max_
你这个不行。 出栈后 就不能确定是否为最大值了,这个需要借助双栈。[/quote] 每次更新栈包括入栈和出站。
瑞卡哥哥 2014-10-28
  • 打赏
  • 举报
回复
引用 1 楼 mujiok2003 的回复:
每次更行栈的时候,更新成员max_, 而max函数直接返回成员max_
你这个不行。 出栈后 就不能确定是否为最大值了,这个需要借助双栈。
加载更多回复(1)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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