我被问到以下问题:
给定n个不同数字的数组,设计一个支持在2个索引之间找到最大值的数据结构。
因此,例如,如果给出的索引是i,j(i 我提出了一些想法,但我无法想到一些直截了当的事情,并且可以证明它符合要求。 帮助表示赞赏。
答案 0 :(得分:0)
这样的事情可能有用吗?你记得最大和最小的数字,因为它们被添加到数组中,所以当你查询最大范围的答案时,你已经知道它(即O(1))
class SmartArray{
innerArray=[];
smallest;
largest;
//There are edge cases here when the array is
//0 or 1 elements that you might have to work out
add(element){
innerArray.add(element);
if(element>largest){
largest=element
}
if(element<smallest){
smallest=element
}
}
//Definitely O(1)
getMaxNumber(){
return largest-smallest;
}
}
答案 1 :(得分:0)
解决此问题的强力方法是构建一个nxn数组,并使用每个[i,j]
的答案填充该数组。一般的想法是:
a[] // this is the input array
results = new [n,n]
// this is the same loop structure used for selection sort
for (i = 0; i < n-1; ++i)
{
largest = a[i]
results[i,i] = largest
for (j = i+1; j < n; ++j)
{
if (a[j] > largest)
{
largest = a[j]
}
results[i,j] = largest
}
}
给定数组[1, 2, 5, 3, 4]
,应创建:
1, 2, 5, 5, 5
?, 2, 5, 5, 5
?, ?, 5, 5, 5
?, ?, ?, 3, 4
?, ?, ?, ?, 4
问号表明我们并不关心那里的价值观。如果您使用值i和j查询,则只需查找results[i,j]
即可获得答案。因为i < j
,您永远不会将任何有问号的单元格编入索引。
因此初始化时间为O(n ^ 2),所需空间为O(n ^ 2)。