来自Google的算法访谈

我是一个很长时间的潜伏者,刚刚接受了Google的采访,他们问我这个问题:

各种艺术家都希望在皇家阿尔伯特音乐厅演出,并负责安排他们的音乐会。 在大会堂演出的要求以先到先得的方式提供。 每天只有一次表演,而且,在5天之内不可能举行任何音乐会

给定要求的时间d,这是不可能的(即在已经调度的性能的5天内),给出O(log n)时间算法以找到下一个可用天d2(d2> d)。

我不知道如何解决,现在面试结束了,我很想知道如何解决这个问题。 知道你们大多数人都很聪明,我想知道你能否在这里帮我一把。 这不适用于家庭作业或任何此类事情。 我只是想学习如何解决它为未来的采访。 我试着询问后续问题,但他说这就是我所能告诉你的。


您需要一个可用日期间隔的普通二分查找树。 只需搜索包含d的区间。 如果它不存在,则将下一个(按顺序)的间隔设置为搜索停止点。

注意:连续间隔必须在单个节点中融合在一起。 例如:可用日期间隔{2 - 15}和{16 - 23}应该变为{2 - 23}。 如果音乐会预订被取消,可能会发生这种情况

或者,可以使用不可用日期的树来代替,只要将连续的不可用间隔融合在一起即可。


将预定的音乐会存储在二叉搜索树中,并通过二分搜索找到可行的解决方案。

像这样的东西:

FindDateAfter(tree, x):
  n = tree.root
  if n.date < x 
    n = FindDateAfter(n.right, x)
  else if n.date > x and n.left.date < x
    return n
  return FindDateAfter(n.left, x)

FindGoodDay(tree, x):
  n = FindDateAfter(tree, x)
  while (n.date + 10 < n.right.date)
    n = FindDateAfter(n, n.date + 5)
  return n.date + 5

我已经使用了一个二叉搜索树(BST),它保存可以安排表演的有效免费日的范围。 其中一个范围必须以int.MaxValue结尾,因为我们有无限的天数,所以它不能被绑定。

以下代码会搜索距离所需日期最近的一天,然后将其返回。

当H是树高时(通常H = log(N),但在某些情况下可以变为H = N),时间复杂度为O(H )。 空间复杂度与时间复杂度相同。

public static int FindConcertTime(TreeNode<Tuple<int, int>> node, int reqDay)
{
    // Not found!
    if (node == null)
    {
        return -1;
    }
    Tuple<int, int> currRange = node.Value;
    // Found range.
    if (currRange.Item1 <= reqDay &&
        currRange.Item2 >= reqDay)
    {
        // Return requested day.
        return reqDay;
    }
    // Go left.
    else if (currRange.Item1 > reqDay)
    {
        int suggestedDay = FindConcertTime(node.Left, reqDay);
        // Didn't find appropriate range in left nodes, or found day
        // is further than current option.
        if (suggestedDay == -1 || suggestedDay > currRange.Item1)
        {
            // Return current option.
            return currRange.Item1;
        }
        else
        {
            // Return suggested day.
            return suggestedDay;
        }
    }
    // Go right.
    // Will always find because the right-most node has "int.MaxValue" as Item2.
    else //if (currRange.Item2 < reqDay)
    {
        return FindConcertTime(node.Right, reqDay);
    }
}
链接地址: http://www.djcxy.com/p/40033.html

上一篇: Algorithm interview from Google

下一篇: Why is Binary Search a divide and conquer algorithm?