Skip to content

Instantly share code, notes, and snippets.

@Centaur
Last active August 29, 2015 14:20
Show Gist options
  • Save Centaur/ce89f7e5c8ad8cb6b23e to your computer and use it in GitHub Desktop.
Save Centaur/ce89f7e5c8ad8cb6b23e to your computer and use it in GitHub Desktop.
algorithm

计算一组Range所覆盖的不重复整数的个数,求 < O(n*n) 的算法。

def cover(rs: Range*):Int = ???


assert(cover(0 to 4, 1 to 5) == 6)
assert(cover(0 to 4, 1 to 3) == 5)
assert(cover(0 to 4, 6 to 7) == 7)
assert(cover(0 to 4, 6 to 7, 2 to 6) == 8)
@Centaur
Copy link
Author

Centaur commented May 9, 2015

Based on @ChenLingPeng 's algorithm, but more idiomatic scala:

def cover(rs: Range*): Int = {
  @annotation.tailrec
  def helper(xs: List[Range], accu: Int):Int = xs match {
    case Nil => accu
    case r :: Nil => accu + r.size
    case r1 :: r2 :: tail => 
      val nextAccu = accu + r1.size
      if (r2.head > r1.last) helper(r2 :: tail, nextAccu)
      else if (r2.last > r1.last) helper(((r1.last + 1) to r2.last) :: tail, nextAccu)
      else helper(r1 :: tail, accu)
  }
  helper(rs.sortBy(_.start).toList, 0)
}

@songfei1983
Copy link

def cover(r: Range*) = r.foldLeft(Set[Int]())(_ ++ _).size

@Centaur
Copy link
Author

Centaur commented May 10, 2015

@songfei1983 🆒 ❗

@jasonqu
Copy link

jasonqu commented May 11, 2015

cool !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment