两个数组的交集|并集|差集|子集

1,885 阅读2分钟

两个数组的交集

集合论中,设A,B是两个集合,由所有属于集合A且属于集合B的元素所组成的集合,叫做集合A与集合B的交集。

集合 {1,2,3} 和 {2,3,4} 的交集为 {2,3}。

//filter实现
let intersect = (a,b) => a.filter(x => b.indexOf(x) > -1);

//Set实现
let intersect1 = (a, b) = >{
	const bSet = new Set(b);
	return [...new Set(a.filter(x = >bSet.has(x)))];
}

let intersect2 = (a, b) = >{
	let result = new Set();

	const other = new Set(b);
	a.forEach(value = >{
		if (other.has(value)) {
			result.add(value);
		}
	});

	return [...result];
}

两个数组的并集

集合论中,设A,B是两个集合,把他们所有的元素合并在一起组成的集合,叫做集合A与集合B的并集。

集合{1, 2, 3} 和 {2, 3, 4} 的并集是 {1, 2, 3, 4}。

//filter+concat实现
let union = (a,b) => a.concat(b.filter(x => !(a.indexOf(x) > -1) ));

//Set实现
let union1 = (a,b) => [...new Set([...a, ...b])];

两个数组的差集

设A,B是两个集合,A={1,2,3,4,5} B={1,2,3,6} 差集B-A={6} 即把B中属于A的元素去掉。

//filter实现
let difference = (a,b) => a.filter(x => b.indexOf(x) === -1);

//Set实现
let difference2 = (a,b) => {
	const bSet = new Set(b);
	return [...new Set([...a].filter(x => !bSet.has(x)))];
}

验证子集

如果集合A的任意一个元素都是集合B的元素,那么集合A称为集合B的子集。

设A,B是两个集合,A={1,2} B={1,2,3,4,5},A是B的子集。

//验证b是a的子集
let isSubset = (a,b) => {
  const aSet = new Set(a), bSet = new Set(b);
  if(bSet.size > aSet.size) { return false; }

  let result = true;
  b.forEach(value => {
    if(!aSet.has(value)){
      result = false;
      return false;
    }
  })
  return result;
}

测试

var a = [1,2,3,4,5], b = [2,4,6,8,10], c = [1,2];

//a与b的交集
console.log(intersect(a,b)); //[2,4]
console.log(intersect1(a,b));//[2,4]

//a与b的并集
console.log(union(a,b));  //[1,2,3,4,5,6,8,10]
console.log(union1(a,b));  //[1,2,3,4,5,6,8,10]

//a-b的差集,即把a中属于b的去掉
console.log(difference(a,b)); //[1,3,5]
console.log(difference2(a,b)); //[1,3,5]

//b-a的差集,即把b中属于a的去掉
console.log(difference(b,a)); //[6,8,10]

//验证子集
console.log(isSubset(a,b)); //false
console.log(isSubset(a,c)); //true

LeetCode相关题

78.子集
leetcode-cn.com/problems/su…

90.子集 II
leetcode-cn.com/problems/su…

349.两个数组的交集
leetcode-cn.com/problems/in…

350.两个数组的交集 II
leetcode-cn.com/problems/in…