1. 程式人生 > 實用技巧 >leetcode每日一題(2020-07-13):350. 兩個陣列的交集 II

leetcode每日一題(2020-07-13):350. 兩個陣列的交集 II

題目描述:
給定兩個陣列,編寫一個函式來計算它們的交集。

今日學習:
1.啊!美好的簡單題!

題解:
1.暴力法,開始居然忘了indexOf
2.暴力法,利用indexOf一次迴圈
3.排序法,雙指標移動
4.hash法,列出較短陣列元素的出現次數,遍歷較長陣列去比較

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
//暴力法1
var intersect = function(nums1, nums2) {
    let res = []
    if(nums1.length > nums2.length) {
        [nums1, nums2] = [nums2, nums1]
    }
    for(let i = 0; i < nums1.length; i++) {
        for(let j = 0; j < nums2.length; j++) {
            if(nums1[i] == nums2[j]) {
                res.push(nums1[i])
                nums2.splice(j, 1)
                break
            }
        }
    }
    return res
};
//暴力法2
var intersect = function(nums1, nums2) {
    let res = []
    if(nums1.length > nums2.length) {
        [nums1, nums2] = [nums2, nums1]
    }
    for(let i = 0; i < nums1.length; i++) {
        let index = nums2.indexOf(nums1[i])
        if(index != -1) {
            res.push(nums1[i])
            nums2.splice(index, 1)
        }
    }
    return res
}
//排序法
var intersect = function(nums1, nums2) {
    nums1 = nums1.sort((a, b) => a - b);
    nums2 = nums2.sort((a, b) => a - b);
    const res = [];
    for(let i = 0, j = 0;i < nums1.length && j < nums2.length;) {
        if (nums1[i] > nums2[j]) {
            j++;
        } else if (nums1[i] < nums2[j]) {
            i++;
        } else {
            res.push(nums1[i]);
            i++;
            j++;
        }
    }
    return res;
}
//hash
var intersect = function(nums1, nums2) {
    if(nums1.length > nums2.length) {
        [nums1, nums2] = [nums2, nums1]
    }
    let nums1Map = new Map()
    for(let i = 0; i < nums1.length; i++) {
        if(nums1Map.has(nums1[i])) {
            nums1Map.set(nums1[i], nums1Map.get(nums1[i]) + 1)
        } else {
            nums1Map.set(nums1[i], 1)
        }
    }
    const res = []
    for(let i = 0; i < nums2.length; i++) {
        if(nums1Map.has(nums2[i]) && nums1Map.get(nums2[i]) != 0) {
            res.push(nums2[i])
            nums1Map.set(nums2[i], nums1Map.get(nums2[i]) - 1)
        }
    }
    return res
}