该列表包含名称和数字。每个名称都有一个数字。该列表按名称排序,列表中的数字排序从最小到最大。我需要找到与 每个名称 相关的所有最大数字的 。
a 1, a 4, a 5, b 0, b 4, c 1, n 9, n 10
我需要放掉</ p>
5 + 4 + 1 + 10 = 20
我需要在 O(登录)时间内完成此操作。
答案 0 :(得分:0)
提示:
扫描列表,保持“当前运行中最大的数字”和“求和的累加器”。每次元素与先前元素不同时,累积当前的最大数字并将其重置为元素的值。
我让您注意适当的初始化和完成。
这是Θ(n),您无法使其更快。 在最坏的情况下,如果所有名称都不相同,则需要输出所有数字的总和,而这要在不读取所有数字的情况下才能完成(如安迪所说)。
答案 1 :(得分:0)
伪代码,找到每个名称O(M)的最后一个O(log N)。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ByteArrayInputStream in = new ByteArrayInputStream(file.getContents());
Thumbnails.of(in)
.scale(1)
.toOutputStream(baos);
byte[] bytes = baos.toByteArray();
对O(log N)使用exponential_search来查找最后一个值,因此也就是最大值。
总共O(M log N)
如果M,名称的数目是一个常数,则得到O(log N),但这将需要一些规则进行约束。