当前位置: 首页 > article >正文

LeetCode 349题解:两个数组的交集

LeetCode 349题解:两个数组的交集

题目描述

给定两个数组,编写一个函数来计算它们的交集。输出结果中的每个元素必须是唯一的,且不考虑顺序。

解题思路

我们可以使用哈希表来记录第一个数组中出现的元素,然后遍历第二个数组,检查元素是否在哈希表中。如果在,则将其加入结果数组,并从哈希表中移除,以确保结果中的元素唯一。

代码实现

#include <stdio.h>
#include <stdlib.h>

int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
    // 创建一个大小为1001的数组,用于记录nums1中元素的出现次数
    int nums1Cnt[1001] = {0};
    
    // 确定结果数组的大小,取两个数组中较小的一个
    int lessSize = nums1Size < nums2Size ? nums1Size : nums2Size;
    
    // 动态分配结果数组的内存,初始化为0
    int * result = (int *) calloc(lessSize, sizeof(int));
    
    // 结果数组的索引
    int resultIndex = 0;

    // 遍历nums1数组,记录每个元素的出现次数
    for(int i = 0; i < nums1Size; i ++) {
        nums1Cnt[nums1[i]]++;
    }

    // 遍历nums2数组,检查元素是否在nums1Cnt中出现过
    for(int i = 0; i < nums2Size; i ++) {
        if(nums1Cnt[nums2[i]] > 0) {
            // 如果出现过,则将其加入结果数组
            result[resultIndex++] = nums2[i];
            // 并将该元素在nums1Cnt中的计数置为0,避免重复加入
            nums1Cnt[nums2[i]] = 0;
        }
    }
    
    // 设置返回结果数组的大小
    *returnSize = resultIndex;
    
    // 返回结果数组
    return result;
}

// 测试主函数
int main() {
    int nums1[] = {1, 2, 2, 1};
    int nums2[] = {2, 2};
    int nums1Size = sizeof(nums1) / sizeof(nums1[0]);
    int nums2Size = sizeof(nums2) / sizeof(nums2[0]);
    int returnSize;
    
    int* result = intersection(nums1, nums1Size, nums2, nums2Size, &returnSize);
    
    printf("Intersection: ");
    for(int i = 0; i < returnSize; i++) {
        printf("%d ", result[i]);
    }
    printf("\n");
    
    // 释放动态分配的内存
    free(result);
    
    return 0;
}

代码解释

  1. int nums1Cnt[1001] = {0};
    创建一个大小为1001的数组nums1Cnt,用于记录nums1中每个元素的出现次数。数组的索引表示元素的值,数组的值表示该元素在nums1中出现的次数。

  2. int lessSize = nums1Size < nums2Size ? nums1Size : nums2Size;
    确定结果数组的大小,取两个数组中较小的一个。这是因为结果数组的大小不会超过两个数组中较小的一个。

  3. int * result = (int *) calloc(lessSize, sizeof(int));
    动态分配结果数组的内存,并使用calloc将其初始化为0。

  4. int resultIndex = 0;
    初始化结果数组的索引为0。

  5. for(int i = 0; i < nums1Size; i ++) { nums1Cnt[nums1[i]]++; }
    遍历nums1数组,记录每个元素的出现次数。例如,如果nums1[i] = 2,则nums1Cnt[2]++

  6. for(int i = 0; i < nums2Size; i ++) { if(nums1Cnt[nums2[i]] > 0) { ... } }
    遍历nums2数组,检查元素是否在nums1Cnt中出现过。如果出现过,则将其加入结果数组,并将该元素在nums1Cnt中的计数置为0,以避免重复加入。

  7. *returnSize = resultIndex;
    设置返回结果数组的大小。

  8. return result;
    返回结果数组。

测试主函数

main函数中,我们定义了两个数组nums1nums2,并调用intersection函数计算它们的交集。最后,打印结果数组并释放动态分配的内存。

复杂度分析

  • 时间复杂度 O ( n + m ) O(n + m) O(n+m),其中 n n n m m m分别是nums1nums2的长度。我们需要遍历两个数组各一次。
  • 空间复杂度 O ( 1 ) O(1) O(1),因为我们使用了一个固定大小的数组nums1Cnt来记录元素的出现次数。

http://www.kler.cn/a/524870.html

相关文章:

  • 使用 postman 测试思源笔记接口
  • WordPress event-monster插件存在信息泄露漏洞(CVE-2024-11396)
  • 8639 折半插入排序
  • 【leetcode】T1599
  • Time Constant | RC、RL 和 RLC 电路中的时间常数
  • 使用 Redis 实现分布式锁的基本思路
  • 使用Vue3实现可拖拽的九点导航面板
  • Kafka的消息协议
  • Linux学习笔记——磁盘管理命令
  • ECMAScript 6语法
  • 【某大厂一面】ThreadLocal如何实现主子线程之间的数据同步
  • HTB--Administrator
  • hunyuan 混元学习
  • Codeforces Round 990 (Div. 2) 题解 A ~ D
  • PySalsa:灵活强大的Python库,专为网络数据分析设计
  • 租车骑绿岛
  • 【解决方案】VMware虚拟机adb连接宿主机夜神模拟器
  • 006 LocalStorage和SessionStorage
  • 1.五子棋对弈python解法——2024年省赛蓝桥杯真题
  • 春晚舞台上的人形机器人:科技与文化的奇妙融合
  • Elasticsearch有哪些应用场景?
  • P4681 [THUSC 2015] 平方运算 Solution
  • 2025_1_29 C语言学习中关于指针
  • 前端拖拽相关功能详解,一篇文章总结前端关于拖拽的应用场景和实现方式(含源码)
  • 【AI论文】Omni-RGPT:通过标记令牌统一图像和视频的区域级理解
  • 单机伪分布Hadoop详细配置