349.两个数组的交集
链接:349.两个数组的交集
难度:Easy
标签:数组、哈希表、双指针、二分查找、排序
简介:给定两个数组,编写一个函数来计算它们的交集。
题解 1 - javascript
- 编辑时间:2020-02-28
- 执行用时:104ms
- 内存消耗:34.9MB
- 编程语言:javascript
- 解法介绍:使用 Set 对象去重后再遍历。
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersection = function (nums1, nums2) {
const set1 = new Set(nums1);
const set2 = new Set(nums2);
const result = [];
for (const num of set2) {
if (set1.has(num)) {
result.push(num);
}
}
return result;
};
题解 2 - javascript
- 编辑时间:2020-02-28
- 执行用时:48ms
- 内存消耗:34.8MB
- 编程语言:javascript
- 解法介绍:使用 Set 对象去重后用 filter 遍历。
var intersection = function (nums1, nums2) {
const a = new Set(nums1);
const b = new Set(nums2);
return [...new Set([...a].filter(x => b.has(x)))];
};
题解 3 - c
- 编辑时间:2021-11-30
- 执行用时:4ms
- 内存消耗:6.4MB
- 编程语言:c
- 解法介绍:二分查找。
int comp(const void *a, const void *b) {
return *(int *)a - *(int *)b;
}
int bs(int *nums, int n, int num) {
int l = 0, r = n - 1, m;
if (nums[l] > num || nums[r] < num) return 0;
while (l < r) {
m = (l + r) >> 1;
if (nums[m] == num) return 1;
if (nums[m] > num) r = m - 1;
else l = m + 1;
}
return nums[l] == num ? 1 : 0;
}
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
qsort(nums2, nums2Size, sizeof(int), comp);
qsort(nums1, nums1Size, sizeof(int), comp);
int *ans = (int *)malloc(sizeof(int) * (nums1Size + nums2Size));
*returnSize = 0;
for (int i = 0; i < nums1Size; i++) {
if (i < nums1Size - 1 && nums1[i] == nums1[i + 1]) continue;
int num = nums1[i];
int check = bs(nums2, nums2Size, num);
if (check) ans[(*returnSize)++] = num;
}
return ans;
}
题解 4 - typescript
- 编辑时间:2020-11-02
- 执行用时:96ms
- 内存消耗:40.2MB
- 编程语言:typescript
- 解法介绍:利用 set 去重搜索。
function intersection(nums1: number[], nums2: number[]): number[] {
const set = new Set(nums1);
const arr: number[] = [];
for (const num of nums2) {
set.has(num) && arr.push(num);
}
return [...new Set(arr)];
}