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


相关文章
|
5月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
504 1
|
6月前
|
jenkins Shell 测试技术
|
6月前
|
安全 jenkins Java
Java、Python、C++支持jenkins和SonarQube(一)
Jenkins 是一个开源的 持续集成(CI)和持续交付(CD) 工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
423 5
|
6月前
|
jenkins Java Shell
Java、Python、C++支持jenkins和SonarQube(全集)
Jenkins 是一个开源的持续集成(CI)和持续交付(CD)工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
599 1
|
6月前
|
jenkins Java 持续交付
Java、Python、C++支持Jenkins和SonarQube(三)
Python与Jenkins和SonarQube
314 1
|
6月前
|
jenkins Java 测试技术
|
9月前
|
Java C++
力扣第一道困难题《3. 无重复字符的最长子串》,c++
首先我们看到这个题是肯定有一种暴力的硬解思路的,那就是将两个vector直接链接起来,然后再排序后,直接返回中间值,这个方法实现起来还是非常容易的,
333 0
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
508 12
|
机器学习/深度学习 并行计算 大数据
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧2
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
552 10
|
C++ Python
探索Python与C/C++混合编程的艺术
探索Python与C/C++混合编程的艺术
507 1

推荐镜像

更多