给你三个整数数组 nums1、nums2 和 nums3 ,请你构造并返回一个 不同 数组,且由 至少 在 两个 数组中出现的所有值组成。
数组中的元素可以按 任意 顺序排列。
示例 1:输入:nums1 = [1,1,3,2], nums2 = [2,3], nums3 = [3] 输出:[3,2]
解释:至少在两个数组中出现的所有值为:
- 3 ,在全部三个数组中都出现过。
- 2 ,在数组 nums1 和 nums2 中出现过。
示例 2:输入:nums1 = [3,1], nums2 = [2,3], nums3 = [1,2] 输出:[2,3,1]
解释:至少在两个数组中出现的所有值为:
- 2 ,在数组 nums2 和 nums3 中出现过。
- 3 ,在数组 nums1 和 nums2 中出现过。
- 1 ,在数组 nums1 和 nums3 中出现过。
示例 3:输入:nums1 = [1,2,2], nums2 = [4,3,3], nums3 = [5] 输出:[]
解释:不存在至少在两个数组中出现的值。
提示:1 <= nums1.length, nums2.length, nums3.length <= 100
1 <= nums1[i], nums2[j], nums3[k] <= 100
1、哈希辅助;时间复杂度O(n),空间复杂度O(n)
func twoOutOfThree(nums1 []int, nums2 []int, nums3 []int) []int {
m1, m2, m3 := make(map[int]int), make(map[int]int), make(map[int]int)
for i := 0; i < len(nums1); i++ {
m1[nums1[i]] = 1
}
for i := 0; i < len(nums2); i++ {
m2[nums2[i]] = 1
}
for i := 0; i < len(nums3); i++ {
m3[nums3[i]] = 1
}
res := make([]int, 0)
for i := 1; i <= 300; i++ {
a := m1[i] + m2[i] + m3[i]
if a >= 2 {
res = append(res, i)
}
}
return res
}
2、哈希辅助+位运算;时间复杂度O(n),空间复杂度O(n)
func twoOutOfThree(nums1 []int, nums2 []int, nums3 []int) []int {
m := make(map[int]int)
arr := [][]int{nums1, nums2, nums3}
for i := 0; i < len(arr); i++ {
for j := 0; j < len(arr[i]); j++ {
value := arr[i][j]
m[value] = m[value] | (1 << i)
}
}
res := make([]int, 0)
for k, v := range m {
if bits.OnesCount(uint(v)) >= 2 {
res = append(res, k)
}
}
return res
}
Easy题目,简单一些的思路,使用3个map统计即可
页面更新:2024-06-16
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号