为了账号安全,请及时绑定邮箱和手机立即绑定

在给定的数组段中查找最小数

在给定的数组段中查找最小数

呼啦一阵风 2022-07-27 16:42:17
假设我们有一个很大的整数数组 A。我们想要回答许多查询,例如:找到索引 0 和 100 之间的最小值找到索引 4 和 90 之间的最小值...示例:A = {6, 1, 7, 5, 3}索引 0 和 1 之间的最小值为 1索引 2 和 3 之间的最小值为 5索引 0 和 4 之间的最小值为 1遍历每个查询的元素并找到最小值的明显方法在性能方面是不够的。我不知何故需要一次性存储所需的信息,然后在恒定时间内回答查询。所以算法不应该是二次的。需要比 O(N * M) 更好的东西。(N:数组大小,M:查询数)我试过但找不到如何做到这一点。它一定是关于查找和存储一些总和并以某种方式使用它们的东西。有任何想法吗?谢谢阅读。
查看完整描述

2 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

要考虑的两个选项:

  1. 每个查询 O(n) 预计算和 O(logn)

  2. O(nlogn) 预计算和每个查询 O(1)

第一种方法是通过递归计算偶数位置的所有对的最小值,然后在 4 的倍数位置处所有 4,然后在所有 8 的倍数处所有 8,依此类推。然后,每当您想要访问特定范围的最小值时,您将其分解为您已经拥有的部分并计算其中的最小值。

例如,要找到元素 1..10 的最小值,请使用 1 和 2..3 和 4..7 以及 8..9 和 10 的最小值。

第二个方法是计算所有位置的所有对的最小值,然后是所有位置的所有 4,然后是所有位置的所有 8。当你有一个特定的范围时,你将它构造为两个部分的最小值并计算这两个部分的最小值。

例如,要找到元素 1..10 的最小值,请使用最小值 1..8 和最小值 3..10。


查看完整回答
反对 回复 2022-07-27
?
慕容森

TA贡献1853条经验 获得超18个赞

为每个问题制作一个“解决方案”、一个“最小值”和一个“最大值”

然后,当您传递到数组的下一个元素时,如果您达到问题的 Index==min,则解决方案=该索引的数量。只要您没有达到最大值,您就可以将解决方案与该索引中的数字和实际解决方案进行比较。(好的,我在发布时意识到这是 n * m,抱歉)


查看完整回答
反对 回复 2022-07-27
  • 2 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号