Advertisement
vit134

Пересечения массивов

Oct 26th, 2018
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.     Найти пересечения двух массивов. Вернуть массив уникальных значений
  3. */
  4.  
  5. var arr1 = [1, 2, 3, 2, 0];
  6. var arr2 = [5, 1, 2, 7, 3, 2];
  7.  
  8. // хэш таблица
  9. // T — O(n + m)
  10. // S — O(n)
  11.  
  12. // В данном примере можно уменьшить использование памяти,
  13. /*
  14.     Вместо массива result возвращать массив nums2
  15.     for (let i = 0; i < nums2.length; i++) {
  16.         let num = nums2[i];
  17.         if (num in hash && hash[num] > 0) {
  18.  
  19.           hash[num]--;
  20.         } else {
  21.             nums2.splice(i, 1);
  22.         }
  23.     }
  24.  
  25.     return nums2;
  26. */
  27. function intersection(nums1, nums2) {
  28.   let result = [];
  29.   let hash = {};
  30.  
  31.   for (let num of nums1) {
  32.     hash[num] = (hash[num] || 0) + 1;
  33.   }
  34.  
  35.   for (let num of nums2) {
  36.     if (num in hash && hash[num] > 0) {
  37.       result.push(num);
  38.       hash[num]--;
  39.     }
  40.   }
  41.  
  42.   return result;
  43. }
  44.  
  45. // Два указателя (если на входе отсортированные массивы это решение лучше)
  46. // T — O(n + m)
  47. // S — O(1)
  48. function intersection(nums1, nums2) {  
  49.   let m = nums1.length;
  50.   let n = nums2.length;
  51.    
  52.   let i = 0;
  53.   let j = 0;
  54.  
  55.   let result = [];
  56.  
  57.   while (i < m && j < n) {
  58.     if (nums1[i] === nums2[j]) {
  59.       result.push(nums1[i]);
  60.       i++;
  61.       j++;
  62.     } else if (nums1[i] < nums2[j]) {
  63.       i++;
  64.     } else {
  65.       j++;
  66.     }
  67.   }
  68.  
  69.   return result;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement