leetcode每日一題(2020-07-13):350. 兩個陣列的交集 II
阿新 • • 發佈:2020-07-13
題目描述:
給定兩個陣列,編寫一個函式來計算它們的交集。
今日學習:
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 }