标签:info ram 数组的交集 双指针 etc 一个 今日学习 指针 return
题目描述:
给定两个数组,编写一个函数来计算它们的交集。
今日学习:
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
}
leetcode每日一题(2020-07-13):350. 两个数组的交集 II
标签:info ram 数组的交集 双指针 etc 一个 今日学习 指针 return
原文地址:https://www.cnblogs.com/autumn-starrysky/p/13291882.html