Advertisement
vit134

Пересечение интервалов (Яндекс)

Nov 9th, 2018
351
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.     Пересечение интервалов
  3.     Даны два отсортированных списка с интервалами присутствия пользователей в онлайне. Найти список интервалов когда оба   пользователя были в онлайне.
  4.     Пример:
  5.     [[8, 12], [17, 22]],[[5, 11], [14, 18], [20, 23]] => [[8, 11], [17, 18], [20, 22]]
  6. */
  7.  
  8. // линейное время
  9. function crossInterval(user1, user2) {
  10.     const list = [];
  11.     let i1 = 0;
  12.     let i2 = 0;
  13.  
  14.     while (i1 < user1.length && i2 < user2.length) {
  15.         const start = Math.max(user1[i1][0], user2[i2][0]);
  16.         const end = Math.min(user1[i1][1], user2[i2][1]);
  17.        
  18.         if (end > start) {
  19.             list.push([start, end]);
  20.         }
  21.  
  22.         user1[i1][1] < user2[i2][1] ? ++i1 : ++i2;
  23.     }
  24.  
  25.     return list;
  26. }
  27.  
  28. // Квадратичное время
  29. function intersection(user1, user2) {
  30.     const list = [];
  31.    
  32.     for (const int1 of user1) {
  33.         for (const int2 of user2) {
  34.             const leftOffset = Math.max(int1[0], int2[0]);
  35.             const rightOffset = Math.min(int1[1], int2[1]);
  36.            
  37.             if (rightOffset > leftOffset) {
  38.                 list.push([leftOffset, rightOffset]);
  39.             }
  40.         }    
  41.     }
  42.  
  43.     return list;
  44. }
  45.  
  46. console.log(crossInterval([[8, 12], [17, 22]], [[5, 11], [14, 20]]));
  47. console.log(crossInterval([[8, 12], [17, 22]], [[13, 15], [14, 20]]));
  48. console.log(crossInterval([[9, 13], [17, 22]], [[8, 12], [14, 20]]));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement