数据结构与算法之集合: LeetCode 349. 两个数组的交集 (Ts, Py, Go版)

PSOC Creator 入门教程超详细 最近工作原因需要使用到赛普拉斯的一款芯片,奈何以前没有用过,所以趁这次也学习了一些简单的用法,总结一下,希望能帮到有需要朋友,因为网上关于这方面的文章少的可怜,详细点的更是少之又少!废话少说,正文开始. 阅读详情

两个数组的交集

  • https://leetcode.cn/problems/intersection-of-two-arrays/description/

描述

  • 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

示例 1

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

示例 2

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

提示

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

Typescript 算法实现


1 )使用数组filter+集合的has方法

function intersection (nums1: number[], nums2: number[]): number[] {
    return [...new Set(nums1)].filter(n => new Set(nums2).has(n)); // 这里filter内部函数每次都会new Set, 不合适
}
  • 这个算法的问题是代码书写逻辑重复,或者说因编码经验而导致的性能低下

2 )使用数组filter+集合的has方法 优化版

function intersection (nums1: number[], nums2: number[]): number[] {
    const n2 = new Set(nums2);
    return [...new Set(nums1)].filter(n => n2.has(n));
}
  • 只需要一次set, 无需循环中每次都做

3 )使用数组filter+数组includes方法或indexOf方法

function intersection (nums1: number[], nums2: number[]): number[] {
    return [...new Set(nums1)].filter(n => nums2.includes(n)); // 或 indexOf 来处理: nums2.indexOf(n) > -1
}

4 )排序 + 双指针

function intersection (nums1: number[], nums2: number[]): number[] {
    nums1.sort((x, y) => x - y);
    nums2.sort((x, y) => x - y);
    const length1 = nums1.length, length2 = nums2.length;
    let index1 = 0, index2 = 0;
    const intersection = [];
    while (index1 < length1 && index2 < length2) {
        const num1 = nums1[index1], num2 = nums2[index2];
        if (num1 === num2) {
            // 保证加入元素的唯一性
            if (!intersection.length || num1 !== intersection[intersection.length - 1]) {
                intersection.push(num1);
            }
            index1++;
            index2++;
        } else if (num1 < num2) {
            index1++;
        } else {
            index2++;
        }
    }
    return intersection;
}
  • 这种是官方示例,代码实现比较复杂,主要依靠两个数组的同一规则排序
  • 之后使用两个指针来指向当前元素,当两者相同时,如果唯一,则存储
  • 在实际应用中,虽然效率上还行,但是并不推荐上述算法实践,代码冗余
    • 时间复杂度主要在两个sort排序, nlogn + mlogm
    • 空间复杂度也是在两个sort排序,logn + logm

5 ) 使用字典

function intersection (nums1: number[], nums2: number[]): number[] {
    const map = new Map();
    nums1.forEach(n => {
        map.set(n, true);
    });
    let res = [];
    nums2.forEach(n => {
        // 匹配
        if(map.get(n)) {
            res.push(n);
            map.delete(n); // 紧接着移除改字典,因为已经用过了 
        }
    });
    return res;
}
  • 上述算法时间复杂度 O(n)
    • 准确来说是 O(m+n)
  • 空间复杂度O(n)
    • 注意:空间复杂度是临时变量的内存消耗
    • 这里 map 是线性增长的,res也可能是线性增长的
    • 所以最大就是 O(n)

5.1 TS中字典Map常用的api回顾

const m = new Map();

// 增、改
m.set('a', 1); // 增加
m.set('b', true); // 增加
m.set('a', 2); // 修改

// 查
m.get('a');

// 删
m.delete('a');
m.clear();

5.2 TS中的集合扩展

5.2.1 )Set操作,使用Set对象:new、add、delete、has、size

let mySet = new set();
mySet.add(1);
mySet.add(5);
mySet.add(5); // 不会保留多个5,只会保留1个
mySet.add('ssse');
let o = {name: 1};
mySet.add(o);
mySet.add({name:1}); // 会保留两个对象,它们内存地址是不同的

console.log(mySet.has(1)); // true
console.log(mySet.has(3)); // false
console.log(mySet.has(5)); // true
console.log(mySet.has('ssse')); // true
console.log(mySet.has(o)); // true

mySet.delete(5);

5.2.2 )迭代Set

// 迭代1 for of 迭代
for(let item of mySet) console.log(item);
// 迭代2
for(let item of mySet.keys()) console.log(item);
// 迭代3
for(let item of mySet.values()) console.log(item); // 值同key
// 以上三种迭代, 输出结果一致

// 下面通过entries()方法来调用
for(let [key, value] of mySet.entries()) console.log(key, value); // 打印key和value果然完全一样

5.2.3 )Set 和 Array互转

// Set转Array, 方式1
const myArr = [...mySet];
// Set转Array, 方式2
const myArr = Array.from(mySet);
// Array转Set
const mySet2 = new Set([1,2,3,4])

5.2.4 )Set的交集和差集

// 求两个Set交集
const intersection = new Set([...mySet].filter(x => mySet2.has(x)))

// 求两个Set差集
const difference = new Set([...mySet].filter(x => !mySet2.has(x)))

Python3 算法实现


1 ) 方案1

from typing import List

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        return list(set(nums1) & set(nums2))

2 ) 方案2

from typing import List

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        set2 = set(nums2)
        return [n for n in set(nums1) if n in set2]

3 ) 方案3

from typing import List

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        return [n for n in set(nums1) if n in nums2]

4 ) 方案4

from typing import List

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        nums1.sort()
        nums2.sort()
        intersection = []
        i, j = 0, 0
        while i < len(nums1) and j < len(nums2):
            if nums1[i] == nums2[j]:
                if not intersection or nums1[i] != intersection[-1]:
                    intersection.append(nums1[i])
                i += 1
                j += 1
            elif nums1[i] < nums2[j]:
                i += 1
            else:
                j += 1
        return intersection

5 ) 方案5

from typing import List

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        map_ = {}
        for n in nums1:
            map_[n] = True
        res = []
        for n in nums2:
            if map_.get(n):
                res.append(n)
                del map_[n]
        return res

Golang 算法实现


1 ) 方案1

func intersection(nums1, nums2 []int) []int {
	set1 := make(map[int]bool)
	set2 := make(map[int]bool)
	for _, n := range nums1 {
		set1[n] = true
	}
	for _, n := range nums2 {
		set2[n] = true
	}
	var result []int
	for n := range set1 {
		if set2[n] {
			result = append(result, n)
		}
	}
	return result
}

2 ) 方案2

func intersection(nums1, nums2 []int) []int {
	set2 := make(map[int]bool)
	for _, n := range nums2 {
		set2[n] = true
	}
	var result []int
	seen := make(map[int]bool)
	for _, n := range nums1 {
		if set2[n] && !seen[n] {
			result = append(result, n)
			seen[n] = true
		}
	}
	return result
}

3 ) 方案3

func intersection(nums1, nums2 []int) []int {
	set1 := make(map[int]bool)
	for _, n := range nums1 {
		set1[n] = true
	}
	var result []int
	seen := make(map[int]bool)
	for _, n := range nums2 {
		if set1[n] && !seen[n] {
			result = append(result, n)
			seen[n] = true
		}
	}
	return result
}

4 ) 方案4

func intersection(nums1, nums2 []int) []int {
	sort.Ints(nums1)
	sort.Ints(nums2)
	var result []int
	i, j := 0, 0
	for i < len(nums1) && j < len(nums2) {
		if nums1[i] == nums2[j] {
			if len(result) == 0 || nums1[i] != result[len(result)-1] {
				result = append(result, nums1[i])
			}
			i++
			j++
		} else if nums1[i] < nums2[j] {
			i++
		} else {
			j++
		}
	}
	return result
}

5 ) 方案5

func intersection(nums1, nums2 []int) []int {
	m := make(map[int]bool)
	for _, n := range nums1 {
		m[n] = true
	}
	var result []int
	for _, n := range nums2 {
		if m[n] {
			result = append(result, n)
			delete(m, n)
		}
	}
	return result
}
给STM32供电,别只接VDD和GND!VBAT、VDDA这些引脚不接会怎样? 本文深入解析STM32电源设计中VBAT与VDDA引脚的关键作用,揭示仅连接VDD和GND可能导致的ADC精度下降、RTC功能异常等问题。通过实测数据对比不同连接方案,提供包括滤波电路设计、PCB布局布线和双电源自动切换在内的实用解决方案,帮助开发者优化系统稳定性与性能。 阅读详情

相关推荐

将AAL图谱对应到Yeo7大网络中【原理,代码分析】

本文介绍了将AAL2图谱映射到Yeo7大功能网络的方法。通过整合皮层(Yeo2011)、小脑(Buckner2011)和纹状体(Choi2012)三个区域的功能网络图谱,采用投票机制确定每个AAL区域的网络归属。具体步骤包括:1)统计每个AAL区域体素在各网络图谱中的分布;2)选择体素数量最多的网络作为该区域的最终标签。该方法实现了从解剖结构到功能网络的映射,可获得120个AAL区域对应的7大功能网络标签。

yes666666的博客 2210

typeScript求交集

intersect(nums1: number[], nums2: number[]): number[] { // let nums1 = [1, 1] // let nums2 = [1, 2] // 交集 // 先对两个数组进行排序 nums1.sort((a, b) => { return a - b }) nums2.sort((a, b) => { return a - b }) .

chuYuanZhang的博客 794

LinuxCNC开发实战:从安装到EtherCAT配置全解析

本文详细解析LinuxCNC开发实战,从系统安装到EtherCAT总线配置全流程。涵盖实时内核优化、伺服驱动器PDO映射、HAL配置及自定义运动学开发,帮助开发者快速搭建工业级数控系统,提升运动控制精度与稳定性。

rgv234567的博客 355

数据结构与算法之字典: LeetCode 349. 两个数组的交集 (Typescript版)

字典:顾名思义,像新华字典一样可查找,基于键值对来存储。

Wang的专栏 346

CubeMX实战:ETH+LWIP+FreeRTOS网络工程从零搭建与AC6编译优化

本文手把手教你使用STM32CubeMX从零搭建集成以太网(ETH)、LWIP协议栈和FreeRTOS的嵌入式网络工程。文章详细解析了外设配置、协议栈调优、任务规划等关键步骤,并重点分享了如何解决ARM Compiler 6(AC6)的兼容性问题,实现编译速度与稳定性的双重提升,助你快速构建稳定的网络应用原型。

n2o3p4的博客 410

宿舍网速跑不满?可能是PPPoE的锅!实测OpenWrt切换DHCP+深澜认证,轻松跑满校园百兆宽带

本文探讨了校园网PPPoE协议的性能瓶颈问题,并提供了通过OpenWrt路由器切换DHCP+深澜认证的技术方案,实测可显著提升网速至百兆宽带满速。文章详细介绍了配置步骤、性能对比及常见问题解决方案,帮助用户优化校园网体验。

weixin_31310913的博客 386

给定两个数组计算它们的交集

这个方法的时间复杂度为 O(n),其中 n 是两个数组中较小的那个的长度。由于 Set 对象可以自动去重,因此这种方法可以处理重复元素的情况。

zhoukaibai的博客 362

【成功安装】Ubuntu22.04极简方式安装Nvidia驱动

今天下午安装了实机的Ubuntu,面临在Linux上安装Nvidia的问题,被这个问题困扰了一整个下午,各种报错整的我头大。后来发现了不需要按照传统的方式去Nvidia官网下载,再命令行安装,直接在线安装即可。

清筱明的博客 5346

数组求交集

本文介绍了在Java中快速判断两个List是否存在交集的几种方法:1)使用contains()遍历检查;2)转换为HashSet利用其O(1)查询特性;3)使用Stream的anyMatch()。重点分析了当数据量大时,将List转为HashSet可显著提升性能,因为HashSet的contains操作是O(1)复杂度,而List是O(n)。最后推荐使用Stream+HashSet的组合方式,既简洁又高效,特别适合处理大规模数据时的交集判断需求。

屋顶小黑猫 349

清洁机器人之屏幕(中,大LCD)方案--ITE 联阳986x系列 soc显控芯片介绍

清洁机器人之屏幕(中,大LCD)方案--ITE 联阳986x系列 soc显控芯片介绍

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 2668

《人工智能基础》[工具篇2]:ChatBox怎么使用本地模型和知识库配置教程

通过设置-知识库,添加,填入知识库名称、选用的嵌入模型创建好知识库后,点击添加文件按钮+,可以上传本地文件、拖动文件支持上传PDF、DOCX等格式的文档。系统会自动对文档进行处理。批量上传:一次最多上传 50 个文档,总大小不超过 2GB;格式检测:支持 PDF/DOCX/TXT/Markdown,不支持 EXE/RAR 等二进制文件。‌文档类‌图片类‌代码类‌:Python、Java、JavaScript等编程文件‌其他‌:Markdown(用于导出对话记录) ‌。

专注大数据、云计算、人工智能、机器人领域技术传播 2946

TypeScript学习(六)

TypeScript学习

Java12324314的博客 630

OpenClaw 在 Docker 容器中的部署实战——零配置启动

本文介绍了OpenClaw在Docker容器中的快速部署方法,对比了本地部署与容器化部署的优势。通过官方镜像和Docker Compose两种方式,5分钟即可完成部署,并详细讲解了配置管理方案(挂载配置文件和环境变量)。文章还提供了飞书集成配置方法,以及生产环境下的日志管理、资源限制、健康检查等优化建议。最后包含常见问题排查指南,帮助开发者快速实现OpenClaw的容器化部署。

刘一说的IT专栏 913

JavaScript 求两个数组的交集,并集,差集,去重

文章目录 1.差集 2.交集 3.并集 4.去重 a = [1, 2, 3],b = [2, 4, 5] 1.差集 (a-b 差集:属于a但不属于b的集合)a-b=[1,3],b-a=[4,5] filter + includes // 差集 let difference = a.concat(b).filter(v => !a.includes(v) ) Set + Array.fro...

Pandora_417的博客 1016

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

求数组的合集,交集,差集

使用 Set 可以很容易地实现并集(Union)、交集(Intersect)和差集 let a = new Set([1, 2, 3]); let b = new Set([4, 3, 2]); // 并集 let union = new Set([...a, ...b]); // Set {1, 2, 3, 4} // 交集 let intersect = new Set([...a].fi...

山海一哥的博客 1984

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【leetcode-python】350. 两个数组的交集 II

给定两个数组,编写一个函数来计算它们的交集。 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2,2] 示例 2: 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[4,9] 说明: 输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。 我们可以不考虑输出结果的顺序。 进阶: 如果给定的数组已经排好序呢?你将如何优化你的算法? 如果 nums1 的大小比 nums2 小很多,哪种方法更

hbk5241的博客 362

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Typescript第二天(类型别名,并集类型和交集类型)

第二天: 1、类型别名 我们可以使用变量声明(let ,const,var)为值声明别名类似的,还可以为类型声明别名 注意 1、TypeScript无法推导类型别名,因此必须显式注解 2、同一类型不能声明两次,不可以有两个一样的type 3、同let和const一样,存在块级作用域,即内部类型别名将遮盖外部类型别名 type Age = number; type Person = { name:string age:Age//number } 2、并集类型和交集类型 为了处理类型的并

qq_42853486的博客 2081

ts:交集类型 交叉类型

【代码】ts:交集类型。

qq_36413371的博客 321

Typescript 两种类型的交集

求出两种类型的交集,只有属性名和属性类型完全一致时,被称为交集。

weixin_43654374的博客 794

LeetCode——数组:两个数组的交集 II

原题给定两个数组,写一个方法来计算它们的交集。例如:给定 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2].注意:   输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。   我们可以不考虑输出结果的顺序。跟进:如果给定的数组已经排好序呢?你将如何优化你的算法?如果 nums1 的大小比 nums2 小很多,哪种方法更优?如果nums2...

zxf15735185131的博客 272

TypeScript 数组Array操作

数组是一个很简单的数据结构,但是每次使用TypeScript的数组的时候又总是忘记怎么用了,干脆直接弄成干货,忘了过来看看。 一、数组的声明 let array1:Array&amp;lt;number&amp;gt;; let array2:number[]; 二、数组初始化 let array1:Array&amp;lt;number&amp;gt; = new Array&amp;lt;number&amp;gt;(); let ...

阳仔博客 15万+

数组对象求交集和差集

larry_liujunwei的博客 418

JavaScript求两个数组的交集,差集

// 交并补 comparison(a, b) { const a_arr: any[] = []; const b_arr: any[] = []; const a_surplus: any[] = []; const b_surplus: any[] = []; let i = 0; if (b.length === 0) { while (i &lt; a.length) ...

xif3681的博客 1130

typescript的数组去重合并

1.最近写一个报表功能,sql返回的数据是这样的 {date:“2019-01-05”,model:TaxeDetailModel }; {date:“2019-01-05”,model:TaxeDetailModel}; {date:“2019-01-05”,model:TaxeDetailModel}; {date:“2019-01-04”,model:TaxeDetailModel}; {d...

qq_38374285的博客 5878

多个数组求交集 js

如下,求profession对应的对象的数组的交集var profession = ["cat", "dog","pig","duck"]; var a = { "cat": [1, 2, 3, "12", 4, 22, 11], "pig": [2, 3, "12"], "dog": [2, 4, 3, "12", 11], "duck":[2,11] }; var jiaoji

u010552788的专栏 6175

TypeScript Array(数组操作)

数组方法 1、concat(); 连接两个或更多的数组,并返回结果。 以下代码连接两个数组: const letters = ['a', 'b', 'c']; const numbers = [1, 2, 3]; letters.concat(numbers); // result in ['a', 'b', 'c', 1, 2, 3] 以下代码连接...

qq_42867580的博客 1万+
上一篇: 数据结构与算法之链表: 使用链表指针获取JSON节点值的算法实现 (Typescript版)
下一篇: 数据结构与算法之字典: LeetCode 349. 两个数组的交集 (Typescript版)
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值