모든 간격을 커버하기 위한 최소 이동 거리

모든 간격을 커버하기 위한 최소 이동 거리

범위와 위치로 많은 간격이 주어집니다. 모든 구간을 동시에 포괄하는 지점에 도달하려면 이동해야 할 최소 거리를 찾아야 합니다. 

예:  

Input : Intervals = [(0 7) (2 14) (4 6)] Position = 3 Output : 1 We can reach position 4 by travelling distance 1 at which all intervals will be covered. So answer will be 1 Input : Intervals = [(1 2) (2 3) (3 4)] Position = 2 Output : -1 It is not possible to cover all intervals at once at any point Input : Intervals = [(1 2) (2 3) (1 4)] Position = 2 Output : 0 All Intervals are covered at current position only so no need travel and answer will be 0 All above examples are shown in below diagram. 

모든 구간을 커버할 수 있는 최소 이동 거리

엔드포인트에만 집중하면 이 문제를 해결할 수 있습니다. 요구 사항은 한 지점에 도달하여 모든 간격을 포괄하는 것이므로 답변이 존재하려면 모든 간격이 한 지점을 공유해야 합니다. 가장 왼쪽 끝점이 있는 구간도 가장 오른쪽 시작점이 있는 구간과 겹쳐야 합니다. 
먼저 모든 간격에서 가장 오른쪽 시작점과 가장 왼쪽 끝점을 찾습니다. 그런 다음 우리의 위치를 ​​이러한 지점과 비교하여 아래에 설명된 결과를 얻을 수 있습니다. 

  1. 이 가장 오른쪽 시작점이 가장 왼쪽 끝점의 오른쪽에 있으면 모든 간격을 동시에 포함할 수 없습니다. (예 2에서와 같이)
  2. 우리 위치가 가장 오른쪽 시작과 가장 왼쪽 끝 사이의 중간에 있으면 이동할 필요가 없으며 모든 간격은 현재 위치로만 처리됩니다(예 3에서와 같이).
  3. 우리 위치가 두 지점 모두에 남아 있으면 가장 오른쪽 시작 지점까지 이동해야 하고, 위치가 두 지점 모두 오른쪽에 있으면 가장 왼쪽 끝 지점까지 이동해야 합니다.

이러한 경우를 이해하려면 위의 다이어그램을 참조하세요. 첫 번째 예에서와 같이 가장 오른쪽 시작은 4이고 왼쪽 가장 끝은 6이므로 모든 간격을 포괄하려면 현재 위치 3에서 4에 도달해야 합니다. 

더 나은 이해를 위해 아래 코드를 참조하십시오.  

C++
   // C++ program to find minimum distance to    // travel to cover all intervals   #include          using     namespace     std  ;   // structure to store an interval   struct     Interval   {      int     start       end  ;      Interval  (  int     start       int     end  )     :     start  (  start  )         end  (  end  )      {}   };   // Method returns minimum distance to travel    // to cover all intervals   int     minDistanceToCoverIntervals  (  Interval     intervals  []         int     N       int     x  )   {      int     rightMostStart     =     INT_MIN  ;      int     leftMostEnd     =     INT_MAX  ;      // looping over all intervals to get right most      // start and left most end      for     (  int     i     =     0  ;     i      <     N  ;     i  ++  )      {      if     (  rightMostStart      <     intervals  [  i  ].  start  )      rightMostStart     =     intervals  [  i  ].  start  ;      if     (  leftMostEnd     >     intervals  [  i  ].  end  )      leftMostEnd     =     intervals  [  i  ].  end  ;      }          int     res  ;      /* if rightmost start > leftmost end then all     intervals are not aligned and it is not     possible to cover all of them */      if     (  rightMostStart     >     leftMostEnd  )      res     =     -1  ;      // if x is in between rightmoststart and       // leftmostend then no need to travel any distance      else     if     (  rightMostStart      <=     x     &&     x      <=     leftMostEnd  )      res     =     0  ;          // choose minimum according to current position x       else      res     =     (  x      <     rightMostStart  )     ?     (  rightMostStart     -     x  )     :      (  x     -     leftMostEnd  );          return     res  ;   }   // Driver code to test above methods   int     main  ()   {      int     x     =     3  ;      Interval     intervals  []     =     {{  0       7  }     {  2       14  }     {  4       6  }};      int     N     =     sizeof  (  intervals  )     /     sizeof  (  intervals  [  0  ]);      int     res     =     minDistanceToCoverIntervals  (  intervals       N       x  );      if     (  res     ==     -1  )      cout      < <     'Not Possible to cover all intervals  n  '  ;      else      cout      < <     res      < <     endl  ;   }   
Java
   // Java program to find minimum distance    // to travel to cover all intervals   import     java.util.*  ;   class   GFG  {       // Structure to store an interval   static     class   Interval   {      int     start       end  ;      Interval  (  int     start       int     end  )      {      this  .  start     =     start  ;      this  .  end     =     end  ;      }   };   // Method returns minimum distance to   // travel to cover all intervals   static     int     minDistanceToCoverIntervals  (  Interval     intervals  []           int     N       int     x  )   {      int     rightMostStart     =     Integer  .  MIN_VALUE  ;      int     leftMostEnd     =     Integer  .  MAX_VALUE  ;          // Looping over all intervals to get       // right most start and left most end      for  (  int     i     =     0  ;     i      <     N  ;     i  ++  )      {      if     (  rightMostStart      <     intervals  [  i  ]  .  start  )      rightMostStart     =     intervals  [  i  ]  .  start  ;      if     (  leftMostEnd     >     intervals  [  i  ]  .  end  )      leftMostEnd     =     intervals  [  i  ]  .  end  ;      }          int     res  ;      // If rightmost start > leftmost end then       // all intervals are not aligned and it       // is not possible to cover all of them       if     (  rightMostStart     >     leftMostEnd  )      res     =     -  1  ;          // If x is in between rightmoststart and       // leftmostend then no need to travel       // any distance      else     if     (  rightMostStart      <=     x     &&         x      <=     leftMostEnd  )      res     =     0  ;          // Choose minimum according to       // current position x       else      res     =     (  x      <     rightMostStart  )     ?      (  rightMostStart     -     x  )     :      (  x     -     leftMostEnd  );          return     res  ;   }   // Driver code   public     static     void     main  (  String  []     args  )   {      int     x     =     3  ;      Interval     []  intervals     =     {     new     Interval  (  0       7  )         new     Interval  (  2       14  )      new     Interval  (  4       6  )     };      int     N     =     intervals  .  length  ;      int     res     =     minDistanceToCoverIntervals  (      intervals       N       x  );          if     (  res     ==     -  1  )      System  .  out  .  print  (  'Not Possible to '     +         'cover all intervalsn'  );      else      System  .  out  .  print  (  res     +     'n'  );   }   }   // This code is contributed by Rajput-Ji   
Python3
   # Python program to find minimum distance to   # travel to cover all intervals   # Method returns minimum distance to travel   # to cover all intervals   def   minDistanceToCoverIntervals  (  Intervals     N     x  ):   rightMostStart   =   Intervals  [  0  ][  0  ]   leftMostStart   =   Intervals  [  0  ][  1  ]   # looping over all intervals to get right most   # start and left most end   for   curr   in   Intervals  :   if   rightMostStart    <   curr  [  0  ]:   rightMostStart   =   curr  [  0  ]   if   leftMostStart   >   curr  [  1  ]:   leftMostStart   =   curr  [  1  ]   # if rightmost start > leftmost end then all   # intervals are not aligned and it is not   # possible to cover all of them   if   rightMostStart   >   leftMostStart  :   res   =   -  1   # if x is in between rightmoststart and   # leftmostend then no need to travel any distance   else   if   rightMostStart    <=   x   and   x    <=   leftMostStart  :   res   =   0   # choose minimum according to current position x   else  :   res   =   rightMostStart  -  x   if   x    <   rightMostStart   else   x  -  leftMostStart   return   res   # Driver code to test above methods   Intervals   =   [[  0     7  ]   [  2     14  ]   [  4     6  ]]   N   =   len  (  Intervals  )   x   =   3   res   =   minDistanceToCoverIntervals  (  Intervals     N     x  )   if   res   ==   -  1  :   print  (  'Not Possible to cover all intervals'  )   else  :   print  (  res  )   # This code is contributed by rj13to.   
C#
   // C# program to find minimum distance    // to travel to cover all intervals   using     System  ;   class     GFG  {       // Structure to store an interval   public     class     Interval   {      public     int     start       end  ;          public     Interval  (  int     start       int     end  )      {      this  .  start     =     start  ;      this  .  end     =     end  ;      }   };   // Method returns minimum distance to   // travel to cover all intervals   static     int     minDistanceToCoverIntervals  (      Interval     []  intervals       int     N       int     x  )   {      int     rightMostStart     =     int  .  MinValue  ;      int     leftMostEnd     =     int  .  MaxValue  ;          // Looping over all intervals to get       // right most start and left most end      for  (  int     i     =     0  ;     i      <     N  ;     i  ++  )      {      if     (  rightMostStart      <     intervals  [  i  ].  start  )      rightMostStart     =     intervals  [  i  ].  start  ;      if     (  leftMostEnd     >     intervals  [  i  ].  end  )      leftMostEnd     =     intervals  [  i  ].  end  ;      }          int     res  ;      // If rightmost start > leftmost end then       // all intervals are not aligned and it       // is not possible to cover all of them       if     (  rightMostStart     >     leftMostEnd  )      res     =     -  1  ;          // If x is in between rightmoststart and       // leftmostend then no need to travel       // any distance      else     if     (  rightMostStart      <=     x     &&         x      <=     leftMostEnd  )      res     =     0  ;          // Choose minimum according to       // current position x       else      res     =     (  x      <     rightMostStart  )     ?      (  rightMostStart     -     x  )     :      (  x     -     leftMostEnd  );          return     res  ;   }   // Driver code   public     static     void     Main  (  String  []     args  )   {      int     x     =     3  ;      Interval     []  intervals     =     {     new     Interval  (  0       7  )         new     Interval  (  2       14  )      new     Interval  (  4       6  )     };      int     N     =     intervals  .  Length  ;      int     res     =     minDistanceToCoverIntervals  (      intervals       N       x  );          if     (  res     ==     -  1  )      Console  .  Write  (  'Not Possible to '     +         'cover all intervalsn'  );      else      Console  .  Write  (  res     +     'n'  );   }   }   // This code is contributed by shikhasingrajput    
JavaScript
    <  script  >   // JavaScript program to find minimum distance to   // travel to cover all intervals   // Method returns minimum distance to travel   // to cover all intervals   function     minDistanceToCoverIntervals  (  Intervals       N       x  ){      let     rightMostStart     =     Intervals  [  0  ][  0  ]      let     leftMostStart     =     Intervals  [  0  ][  1  ]      // looping over all intervals to get right most      // start and left most end      for  (  let     curr     of     Intervals  ){      if  (  rightMostStart      <     curr  [  0  ])      rightMostStart     =     curr  [  0  ]      if  (  leftMostStart     >     curr  [  1  ])      leftMostStart     =     curr  [  1  ]      }      let     res  ;      // if rightmost start > leftmost end then all      // intervals are not aligned and it is not      // possible to cover all of them      if  (  rightMostStart     >     leftMostStart  )      res     =     -  1          // if x is in between rightmoststart and      // leftmostend then no need to travel any distance      else     if  (  rightMostStart      <=     x     &&     x      <=     leftMostStart  )      res     =     0          // choose minimum according to current position x      else      res     =     (  x      <     rightMostStart  )  ?  rightMostStart  -  x     :     x  -  leftMostStart      return     res   }   // Driver code to test above methods   let     Intervals     =     [[  0       7  ]     [  2       14  ]     [  4       6  ]]   let     N     =     Intervals  .  length   let     x     =     3   let     res     =     minDistanceToCoverIntervals  (  Intervals       N       x  )   if  (  res     ==     -  1  )      document  .  write  (  'Not Possible to cover all intervals'    '  
'
) else document . write ( res ) // This code is contributed by shinjanpatra < /script>

산출: 

1 

시간 복잡도: 에)

보조 공간: 에)
 

퀴즈 만들기