支持在O(1)中查找2个索引之间的最大数量的数据结构

时间:2018-04-27 14:36:58

标签: data-structures

我被问到以下问题: 给定n个不同数字的数组,设计一个支持在2个索引之间找到最大值的数据结构。 因此,例如,如果给出的索引是i,j(i

我提出了一些想法,但我无法想到一些直截了当的事情,并且可以证明它符合要求。

帮助表示赞赏。

2 个答案:

答案 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)。