LeetCode 350. 两个数组的交集 II C/C++/Python

简介: LeetCode 350. 两个数组的交集 II C/C++/Python

题目描述

给你两个整数数组 nums1nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

使用哈希进行求解。

C语言版

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int _callback(const void* val1, const void* val2)
{
  return *(int*)val1 - *(int*)val2;
}
int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
  int index1 = 0, index2 = 0;
  qsort(nums1, nums1Size, sizeof(nums1[0]), _callback);
  qsort(nums2, nums2Size, sizeof(nums2[0]), _callback);
  *returnSize = 0;
  int* ret = (int*)malloc(sizeof(int) * fmin(nums1Size, nums2Size));
  while (index1 < nums1Size && index2 < nums2Size)
  {
    if (nums1[index1] < nums2[index2])
    {
      index1++; /*如果nums1中的数据小,那么nums1的游标下移*/
    }
    else if (nums1[index1] > nums2[index2])
    {
      index2++; /*如果nums2中的数据小,那么nums2的游标下移*/
    }
    else
    {
      *(ret + (*returnSize)) = nums1[index1]; /*两个数相等则加入容器*/
      index1++;
      index2++;
      (*returnSize)++;
    }
  }
  return ret;
}

C++版

class Solution {
public:
  vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
    unordered_map<int, int> flag;
    vector<int> ret;
    for (vector<int>::iterator it = nums1.begin(); it != nums1.end(); it++)
    {
      if (flag.find(*it) == flag.end())
      {
        flag.insert(make_pair(*it, 1));
      }
      else
      {
        flag[*it]++;
      }
    }
    for (vector<int>::iterator it = nums2.begin(); it != nums2.end(); it++)
    {
      if (flag.find(*it) != flag.end())
      {
        if (flag[*it] > 0)
        {
          ret.push_back(*it);
          flag[*it]--;
        }
      }
    }
        return ret;
  }
};

Python版

#使用哈希记录nums1元素及元素出现的次数,并在nums2中找同时出现的元素存入列表
#时间复杂度   O(m+n)
class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        hashmap = {}
        ret = []
        if len(nums1) > len(nums2):
            return self.intersect(nums2, nums1)
        for i in nums1:
            if hashmap.get(i) == None:
                hashmap[i] = 1
            else:
                hashmap[i] += 1
        for i in nums2:
            if hashmap.get(i) != None:
                if hashmap[i] > 0:
                    ret.append(i)
                    hashmap[i] -= 1
        return ret


相关文章
|
4月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
251 0
|
2月前
|
C++ Python
探索Python与C/C++混合编程的艺术
探索Python与C/C++混合编程的艺术
42 1
|
2月前
|
存储 Python
Python多个set中的交集
Python多个set中的交集
23 1
|
2月前
|
存储 自然语言处理 数据处理
使用Python计算多个集合的交集详解
使用Python计算多个集合的交集详解
49 1
|
2月前
|
C++
【LeetCode 12】349.两个数组的交集
【LeetCode 12】349.两个数组的交集
17 0
WK
|
3月前
|
机器学习/深度学习 Java 程序员
为什么Python比C++慢很多?
Python相较于C++较慢主要体现在:动态类型系统导致运行时需解析类型,增加开销;作为解释型语言,逐行转换字节码的过程延长了执行时间;自动内存管理和垃圾回收机制虽简化操作但也带来了额外负担;全局解释器锁(GIL)限制了多线程性能;尽管Python库方便灵活,但在性能上往往不及C++底层库。然而,Python在某些领域如数据分析、机器学习中,凭借其高级别抽象和简洁语法仍表现出色。选语言需依据具体应用场景和需求综合考量。
WK
87 1
|
4月前
|
Unix C语言 C++
Python调用C/C++
Python调用C/C++
27 2
|
4月前
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
28 1
|
4月前
|
PHP C++ Python
右手坐标系,空间点绕轴旋转公式&程序(Python和C++程序)
右手坐标系,空间点绕轴旋转公式&程序(Python和C++程序)
74 0
WK
|
4月前
|
机器学习/深度学习 运维 Java
Python 相对于 C++ 有哪些明显的优势
C++是一种强大且高效的编程语言,被广泛应用在系统软件、游戏开发、嵌入式系统等多个领域。然而Python在某些方面展现出显著优势:Python语法简洁直观,易于学习与使用,提高了代码的可读性和团队协作效率;拥有丰富的第三方库和框架资源,能有效提升开发效率;具备良好的跨平台性,无需大量修改即可适应不同操作系统;
WK
59 0