📂
LeetCode Note
  • Introduction
  • Tools
    • Clean Code
    • 英文小辭典
    • JS Reference
    • 常見 Edge Case
    • Array Method
    • Object Method
    • Function
    • Hashing
    • Prototype
    • 處理 Array 小撇步
    • String Method
    • Math / Date
    • loop
    • JSON.xx / localStorage
    • Date
    • Regex
    • Memorization
    • reduce condition
    • 命名
  • 筆記 Note
    • Promise
    • Walking the DOM
    • Element size and scrolling
    • CSS
  • Leetcode todo
    • ToDo
  • Array
    • # Select random poker without duplicates
    • # 最少替換達成不連續字串
    • # 724 Find Pivot Index
    • # 747. Largest Number At Least Twice of Others
    • # 01 getMaxProfit
    • # maxOfBiggestVal
    • # findSecondLargest
    • # 41 First Missing Positive
    • # 134 Gas Station (有圖)
    • # 202 Happy Number
    • # 344 Reverse String
    • # 412 Fizz Buzz
    • # 561 Array Partition I
    • # 804 Unique Morse Code Words
    • # 905 Sort Array By Parity
    • # 121. Best Time to Buy and Sell Stock.js
    • # 122 Best Time to Buy and Sell Stock II
    • # 189 Rotate Array
    • # 229 Majority Element II
    • # 268 Missing Number.
    • # 299 Bulls and Cows (有圖)
    • # 896 Monotonic Array
    • # 1002 Find Common Characters
    • # 1051 Height Checker
    • # 1185 Day of the Week
    • # 169 Majority Element
    • # 605. Can Place Flowers
    • # 350 Intersection of Two Arrays II (有圖)
    • # 482. License Key Formatting
  • Set / Map
    • # GetLengthOfLongestSubstring
    • #1 Two Sum
    • # 217 Contains Duplicate
    • # 1122 Relative Sort Array
    • # 1160 Find Words That Can Be Formed by Characters
    • #811 Subdomain Visit Count
    • # 349 Intersection of Two Arrays
    • # 819 Most Common Word
  • Two Pointer
    • #704. Binary Search
    • #26 Remove Duplicates from Sorted Array (有圖)
    • #27 Remove Element
    • # 66 Plus One
    • # 80 Remove Duplicates from Sorted Array II (有圖)
    • # 88 Merge Sorted Array (有圖)
    • # 125 Valid Palindrome
    • #167 Two Sum II - Input array is sorted (有圖)
    • # 283 Move Zeroes (有圖)
    • # 38 Count and Say
    • # 557. Reverse Words in a String III
    • #977 Squares of a Sorted Array
    • #209 Minimum Size Subarray Sum
  • String
    • # 13 Roman to Integer (有圖)
    • # 771 Jewels and Stones
    • # 937 Reorder Data in Log Files
    • # 929 Unique Email Addresses
    • # 1108 Defanging an IP Address
    • #14 Longest Common Prefix
    • # 387 First Unique Character in a String (有圖)
    • #193 Valid Phone Numbers
    • # 28 Implement strStr()
    • #383 Ransom Note
  • Stack
    • # 20 Valid Parentheses (有圖)
    • # 155 Min Stack
    • BF 165. remove characters
    • #1047 Remove All Adjacent Duplicates In String
  • Binary Search
    • # 1064 Fixed Point (有圖)
    • # 852 Peak Index in a Mountain Array
  • Recursion 遞迴
    • #2625. Flatten Deeply Nested Array
  • Math
    • # 7 Reverse Integer
    • # 9 Palindrome Number (有圖)
    • #53 Maximum Subarray (有圖)
    • # 1085 Sum of Digits in the Minimum Number.
    • # 136 Single Number
    • # 204 Count Primes (有圖)
    • #243 Shortest Word Distance
  • Dynamic Programing
    • # 322 Coin Change
    • # 509 Fibonacci Number (有圖)
    • # 70 Climbing Stairs
    • # 198 House Robber
    • # 168. Excel Sheet Column Title
  • Others
    • # 205. Isomorphic Strings
    • Implement js Array method
    • Flatten Array/Object
  • Matrix
    • 867. Transpose Matrix
  • Queue
    • DOM tree with queue
  • 排序
    • Different Sort
Powered by GitBook
On this page
  • 怎麼解
  • 改善
  • Code

Was this helpful?

  1. Array

# 350 Intersection of Two Arrays II (有圖)

兩種方法,一個是類似桶子排序; 一個是比對重覆原本陣列值 = false

Previous# 605. Can Place FlowersNext# 482. License Key Formatting

Last updated 11 months ago

Was this helpful?

Given two arrays, write a function to compute their intersection.
跟 349. 交集 I 不一樣的是這題 input Array 可能會有重覆的值
Example 1:

Input: nums1 = [1,2,2,1], nums2 = [2,2]
Output: [2,2]
Example 2:

Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
Output: [4,9]
Note:

Each element in the result should appear as many times as it shows in both arrays.
The result can be in any order.
Follow up:

What if the given array is already sorted? How would you optimize your algorithm?
What if nums1's size is small compared to nums2's size? Which algorithm is better?
What if elements of nums2 are stored on disk, and the memory is limited such that you cannot load all elements into the memory at once?

*/

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersect = function(nums1, nums2) {}

怎麼解

第一個想法就是運用之前寫過的方法(我也忘了是哪題,到時候找到再補)

  • forEach nums1

  • 然後 nums2.indexOf(num1 item)

    • 找到代表有交集,把 item 存進 result array,然後 nums2[ num1 item ] = false,避免之後重覆找

    • 若沒找到代表這個值沒交集,在繼續找下一個

var intersect = function(nums1, nums2) {
    let result = [];
    nums1.forEach(num1 => {
        let ind = nums2.indexOf(num1)
        if(ind !== -1){
            result.push(num1);
            nums2[ind] = false;
        }
    })
    return result;
};
// faster than 66.58% of JavaScript online submissions

改善

後來看到別人解法效能更好,是類似桶子排序概念,但因為此題不但要存值還要存出現幾次,所以會用 obj 來存

  • 首先會把 nums1 [4, 9, 5, 4] 存進桶子裡,value 代表次數

  • 再來就是 nums2 [9,4,9,8,4] 了,他會去找 bucket 裡是否存在

    • 存在的話代表有交集,存進 result,並次數 -- (避免之後重覆存到)

    • 不存在代表沒交集,繼續下一個

result = []
buckets = {
    4: 2,
    9: 1,
    5: 1
}
nums2 = [9,4,9,8,4]
---- 開始找囉 -------
9 有在 buckets 裡
result = [9]
buckets = = {
    4: 2,
    9: 0,
    5: 1
}
------------------
4 有在 buckets 裡
result = [9, 4]
buckets = = {
    4: 1,
    9: 0,
    5: 1
}
------------------
9 沒有在 buckets 裡  (因為 buckets 裡的 9 數量已經變 0)
------------------
8 沒有有在 buckets 裡
------------------
4 有在 buckets 裡
result = [9, 4, 4]
buckets = = {
    4: 0,
    9: 0,
    5: 1
}

Code

var intersect2 = function(nums1, nums2) {
    // like bucket sort 桶子排序, 因為要記什麼值有幾個所以用 obj
    let buckets = {};
    let result = []
    for(let i of nums1){
        // ex { 4這個值: 1次}
        buckets[i] = buckets[i] ? buckets[i] + 1 : 1;
    }
    for(let i of nums2){
        if(buckets[i]){
            buckets[i] --;
            result.push(i);
        }
    }

    return result;
};
console.log(intersect2([4,9,5, 4], [9,4,9,8,4]))

// faster than 85.07% of JavaScript online submissions
LeetCode