Topcoder:有关UnionofIntervals问题的问题

时间:2018-11-04 23:53:15

标签: algorithm data-structures binary-search

  1. Problem Statement

  2. Basis for my approach

    TL; DR :对单调谓词域的二进制搜索。

  3. 我的单调递增谓词

    大于mid的元素数量是否小于或等于total - n - 1

  4. 我的代码

def nthElement(los, his, n):
   """Find the n-th element...

   los - array, lower bounds of intervals
   his - array, upper bounds of intervals
   n   - int,   index of the target element
   """
   # search space for the binary search.
   lo, hi = min(los), max(his)
   # total number of elements in the search space.
   total = sum(j-i+1 for i, j in zip(los, his))
   # search the space.
   while lo < hi:
       mid = lo + (hi - lo) // 2
       # number of elements in search space
       # greater than `mid`. Note that `mid`
       # might not be a valid member
       # of search space, i.e. it may fall
       # between intervals.
       ngreater = 0
       for llim, hlim in zip(los, his):
           # for valid members of search space
           if mid < hlim and mid >= llim:
               ngreater += hlim - mid
           # if `mid` is between intervals
           elif mid < hlim:
               ngreater += hlim - llim + 1

       # evaluate predicate
       if ngreater <= total - n - 1:
           hi = mid
       else:
           lo = mid + 1
   return lo

我的问题是关于mid不是搜索空间的有效成员的情况,如代码注释中所述。我的解决方案看起来正确吗?

  1. 尝试回答

假设mid等于 e ,因此 e 不是搜索空间的成员。

情况1:假设谓词在 e 处的计算结果为true。由于谓词必须对某些元素严格小于 e e 不是搜索空间的成员)求值为true,并且hi设置为< em> e ,下一个迭代的搜索空间将包含目标。

情况2:假设谓词在 e 处的计算结果为false。然后,目标位于严格大于 e 的搜索空间子集中。 lo设置为 e +1,下一次迭代的搜索空间包含目标。

由于这两种情况都会为下一次迭代产生有效的搜索空间,所以 e 不会破坏程序。

0 个答案:

没有答案