leetcode2032_go_至少在两个数组中出现的值

题目

给你三个整数数组 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)

leetcode2032_go_至少在两个数组中出现的值

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

标签:个数   复杂度   整数   数组   示例   题目   思路   元素   提示   两个   简单   时间   科技   空间

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top