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

python每日一题练习 两个数组的交集 非常简单

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

先排序   1 1 2 2   2 2 直到二者有相等的元素 将这个元素标记下来 然后继续往后移动 不然就是谁小谁往后移动 我们暂时不考虑 交集中元素唯一的这个条件 好的 来写代码

class Solution(object):def intersection(self, nums1, nums2):nums1=sorted(nums1)nums2=sorted(nums2)index_1=0index_2=0#nums3=[]while index_1<len(nums1) and index_2<len(nums2):if nums1[index_1]==nums2[index_2]:nums3.append(nums1[index_1])index_1+=1index_2+=1elif nums1[index_1]<nums2[index_2]:index_1+=1else:index_2+=1return nums3
solution=Solution()
result=solution.intersection([1,2,2,1], [2,2])
print(result)

好的 现在这个代码的问题是出现重复的还是会继续记录下去 那再去重就可以了 这个方法肯定是可以的 但是会不会超出时间限制我就不知道了 我们还是应该使用哈希表的方式来 只有在这个key不在的时候 才加上 

class Solution(object):def intersection(self, nums1, nums2):nums1=sorted(nums1)nums2=sorted(nums2)print(nums1,nums2)index_1=0index_2=0#nums3= {}while index_1<len(nums1) and index_2<len(nums2):if nums1[index_1]==nums2[index_2]:if nums1[index_1] not in nums3:nums3[index_1]=nums1[index_1]index_1+=1index_2+=1elif nums1[index_1]<nums2[index_2]:index_1+=1else:index_2+=1return list(nums3.values())
solution=Solution()
result=solution.intersection([1,2,2,1],  [1,1])
print(result)

但是不对 这个输出是 【1,1】我很不理解 我不是只有这个key没在的时候才加入吗? {0: 1, 1: 1} nums3打印出来是这样的 然后其实是我对于字典的了解还是太浅了

nums3[index_1]=nums1[index_1] 这句代码的意思是使用index_1做key 而不是使用Nums[index_1]做key
class Solution(object):def intersection(self, nums1, nums2):nums1=sorted(nums1)nums2=sorted(nums2)print(nums1,nums2)index_1=0index_2=0#nums3= {}while index_1<len(nums1) and index_2<len(nums2):if nums1[index_1]==nums2[index_2]:if nums1[index_1] not in nums3:nums3[nums1[index_1]]=nums1[index_1]index_1+=1index_2+=1elif nums1[index_1]<nums2[index_2]:index_1+=1else:index_2+=1print(nums3)return list(nums3.values())
solution=Solution()
result=solution.intersection([1,2,2,1,3],  [1,1,3])
print(result)

这样写就是对的 但是运行速度实在是太慢了 我们思考其他方法 可以是两个数组都统计 一下各自的数字是多少 如果在这个地方二者都是有这个数字的话 那么交集就加上这个数字 因为两个数组的Nums【i】的范围也是很有限的 那我们试试这个方法

class Solution(object):def intersection(self, nums1, nums2):nums1_counter=[0]*1001nums2_counter = [0] * 1001nums3=[]for i in range(len(nums1)):if nums1_counter[nums1[i]]==0:nums1_counter[nums1[i]]=nums1[i]#这样就行for i in range(len(nums2)):if nums2_counter[nums2[i]]==0:nums2_counter[nums2[i]]=nums2[i]#这样就行for i in range(1001):if nums1_counter[i] and nums2_counter[i]:nums3.append(nums1_counter[i])return nums3
solution=Solution()
result=solution.intersection([1,2,2,1,3],  [1,1,3])
print(result)但是我又忽略了一种情况 那么就是如果这个数值是0的话 那这样的话我设置的这个value值也是0 那不行 其实是应该这样的 就是应该如果这个数字有的话 设置为1 但是在计算交集的时候 去appendkey 而不是value
class Solution(object):def intersection(self, nums1, nums2):nums1_counter=[0]*1001nums2_counter = [0] * 1001nums3=[]for i in range(len(nums1)):if nums1_counter[nums1[i]]==0:nums1_counter[nums1[i]]=1#这样就行for i in range(len(nums2)):if nums2_counter[nums2[i]]==0:nums2_counter[nums2[i]]=1#这样就行for i in range(1001):if nums1_counter[i] and nums2_counter[i]:nums3.append(i)return nums3
solution=Solution()
result=solution.intersection([0,1,2,2,1,3],  [0,1,1,3])
print(result)但是运行速度还是不行 我们继续寻找优化的方法 其实可以先去重了 然后再使用双指针法 

更好的思路是对一个进行去重 然后看去重之后的这个数组的每个元素是不是在另外一个数组 在的话就给加上 这样也不用担心元素重复的问题 都是可以的

如果喜欢这篇文章 欢迎点赞收藏~

http://www.dtcms.com/a/326633.html

相关文章:

  • GCN: 图卷积网络,概念以及代码实现
  • 【LeetCode刷题集】--排序(三)
  • Protocol Buffers (protobuf) API 接口完全指南
  • maven项目打包成sdk后在别的项目使用
  • 从0开始的中后台管理系统-5(部门管理以及菜单管理页面功能实现)
  • 【科研绘图系列】R语言绘制散点图折线图误差棒组合图
  • 指派问题-匈牙利算法
  • 2025牛客多校第八场 根号-2进制 个人题解
  • HTTPS应用层协议-CA签名与证书
  • Vue 3 快速入门 第六章
  • MaixPy简介
  • Projects
  • 进程管理是什么
  • DeepSeek生成的高精度大数计算器
  • 自制网页并爬取,处理异常值(第十九节课内容总结)
  • .NET/C# webapi框架下给swagger的api文档中显示注释(可下载源码)
  • MP3Tag 软件功能简介
  • (二)vscode搭建espidf环境,配置wsl2
  • 第16届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2025年4月真题
  • 进阶版|企业级 AI Agent 的构建实践
  • 【03】厦门立林科技——立林科技 嵌入式 校招笔试,题目记录及解析
  • 从零开始的ReAct Agent尝试
  • 应用监控工具Skywalking
  • bitbake –s:列出所有可编译的模块
  • 【STL】queue队列容器
  • priority_queue(优先级队列)和仿函数
  • ArkUI中的自定义组件(一)
  • 用于计算的程序是部署在哪里,为什么可以这样?
  • 从 WebView2 迁移至 DotNetBrowser:第一部分
  • android 换肤框架详解2-LayoutInflater源码解析