Skip to content

Commit b1be705

Browse files
committed
哈希: 交集
Change-Id: Id6d563aac711d8dc7b8cf3e652345a3fac49b9db
1 parent 6bfc0b7 commit b1be705

File tree

2 files changed

+124
-0
lines changed

2 files changed

+124
-0
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*
2+
* @lc app=leetcode.cn id=349 lang=golang
3+
*
4+
* [349] 两个数组的交集
5+
*
6+
* https://leetcode-cn.com/problems/intersection-of-two-arrays/description/
7+
*
8+
* algorithms
9+
* Easy (65.69%)
10+
* Likes: 128
11+
* Dislikes: 0
12+
* Total Accepted: 33.9K
13+
* Total Submissions: 51.2K
14+
* Testcase Example: '[1,2,2,1]\n[2,2]'
15+
*
16+
* 给定两个数组,编写一个函数来计算它们的交集。
17+
*
18+
* 示例 1:
19+
*
20+
* 输入: nums1 = [1,2,2,1], nums2 = [2,2]
21+
* 输出: [2]
22+
*
23+
*
24+
* 示例 2:
25+
*
26+
* 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
27+
* 输出: [9,4]
28+
*
29+
* 说明:
30+
*
31+
*
32+
* 输出结果中的每个元素一定是唯一的。
33+
* 我们可以不考虑输出结果的顺序。
34+
*
35+
*
36+
*/
37+
func intersection(nums1 []int, nums2 []int) []int {
38+
m1 := map[int]bool{}
39+
for _, el := range nums1 {
40+
m1[el] = true
41+
}
42+
m2 := map[int]bool{}
43+
for _, el := range nums2 {
44+
if m1[el] {
45+
m2[el] = true
46+
}
47+
}
48+
ret := []int{}
49+
for k, _ := range m2 {
50+
ret = append(ret, k)
51+
}
52+
return ret
53+
}
54+
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* @lc app=leetcode.cn id=350 lang=golang
3+
*
4+
* [350] 两个数组的交集 II
5+
*
6+
* https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/description/
7+
*
8+
* algorithms
9+
* Easy (44.00%)
10+
* Likes: 188
11+
* Dislikes: 0
12+
* Total Accepted: 48.1K
13+
* Total Submissions: 108.5K
14+
* Testcase Example: '[1,2,2,1]\n[2,2]'
15+
*
16+
* 给定两个数组,编写一个函数来计算它们的交集。
17+
*
18+
* 示例 1:
19+
*
20+
* 输入: nums1 = [1,2,2,1], nums2 = [2,2]
21+
* 输出: [2,2]
22+
*
23+
*
24+
* 示例 2:
25+
*
26+
* 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
27+
* 输出: [4,9]
28+
*
29+
* 说明:
30+
*
31+
*
32+
* 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
33+
* 我们可以不考虑输出结果的顺序。
34+
*
35+
*
36+
* 进阶:
37+
*
38+
*
39+
* 如果给定的数组已经排好序呢?你将如何优化你的算法?
40+
* 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
41+
* 如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
42+
*
43+
*
44+
*/
45+
46+
// @lc code=start
47+
func intersect(nums1 []int, nums2 []int) []int {
48+
m1 := map[int]int{}
49+
for _, el := range nums1 {
50+
m1[el] += 1
51+
}
52+
m2 := map[int]int{}
53+
for _, el := range nums2 {
54+
if m1[el] > 0 {
55+
m2[el] += 1
56+
}
57+
}
58+
ret := []int{}
59+
for k, v2 := range m2 {
60+
if v2 > m1[k] {
61+
v2 = m1[k]
62+
}
63+
for i := 0; i < v2; i++ {
64+
ret = append(ret, k)
65+
}
66+
}
67+
return ret
68+
}
69+
// @lc code=end
70+

0 commit comments

Comments
 (0)