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

代码随想录算法训练营第七天|454.四数相加II+383. 赎金信+15. 三数之和+18. 四数之和

非原创,搬运记录解题方法学习思路,一同进步

Day7 第三章 哈希表part02

  • 备忘
  • 454.四数相加II
    • 思路
    • 代码
  • 383. 赎金信
    • 思路
    • 代码
  • 15. 三数之和
    • 思路
    • 代码
  • 18. 四数之和
    • 思路
    • 代码
  • 总结

)

备忘

454.四数相加II

给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

思路

好神奇的思路,因为结果为0,所以四项中两项到等式的另一边。
a + b + c + d = 0
→ a + b = - (c + d)

代码

classSolution:deffourSumCount(self,nums1:List[int],nums2:List[int],nums3:List[int],nums4:List[int])->int:cnt=Counter()forxinnums1:foryinnums2:cnt[x+y]+=1result=0forxinnums3:foryinnums4:result+=cnt[-x-y]returnresult

383. 赎金信

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

思路

多集比较

代码

classSolution:defcanConstruct(self,ransomNote:str,magazine:str)->bool:ifCounter(ransomNote)<=Counter(magazine):returnTrueelse:returnFalse

15. 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

思路

没什么技巧可言,传统做法。先排序,因为需要满足三数之和为0,所以第一个数>0或者数组长度不足3就可以排除了。接着固定第一个值后利用双指针找到满足和为0的index,再排除重复值。

代码

classSolution:defthreeSum(self,nums:list[int])->list[list[int]]:n=len(nums)res=[]if(notnumsorn<3):return[]nums.sort()res=[]foriinrange(n):if(nums[i]>0):returnresif(i>0andnums[i]==nums[i-1]):continueL=i+1R=n-1while(L<R):if(nums[i]+nums[L]+nums[R]==0):res.append([nums[i],nums[L],nums[R]])while(L<Randnums[L]==nums[L+1]):L=L+1L=L+1R=R-1elif(nums[i]+nums[L]+nums[R]>0):R=R-1else:L=L+1returnres

18. 四数之和

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。

思路

思路与上一题相同,参考了灵神的优化思路。感觉是一个小学奥数问题。
https://leetcode.cn/problems/4sum/solutions/2344514/ji-zhi-you-hua-ji-yu-san-shu-zhi-he-de-z-1f0b

代码

classSolution:deffourSum(self,nums:List[int],target:int)->List[List[int]]:nums.sort()ans=[]n=len(nums)forainrange(n-3):x=nums[a]ifaandx==nums[a-1]:continueifx+nums[a+1]+nums[a+2]+nums[a+3]>target:breakifx+nums[-3]+nums[-2]+nums[-1]<target:continueforbinrange(a+1,n-2):y=nums[b]ifb>a+1andy==nums[b-1]:continueifx+y+nums[b+1]+nums[b+2]>target:breakifx+y+nums[-2]+nums[-1]<target:continuec=b+1d=n-1whilec<d:s=x+y+nums[c]+nums[d]ifs>target:d-=1elifs<target:c+=1else:ans.append([x,y,nums[c],nums[d]])c+=1whilec<dandnums[c]==nums[c-1]:c+=1d-=1whiled>candnums[d]==nums[d+1]:d-=1returnans

总结

没想象中的难,优化时考虑边界问题。

http://www.jsqmd.com/news/608859/

相关文章:

  • 5分钟搞定!用TranslucentTB让Windows任务栏变透明,桌面颜值瞬间翻倍
  • 无线定位算法实战:用MATLAB实现AOA、TDOA、TOA和RSSI定位(附完整代码)
  • Kali与编程:6 种方法用 Kali 批量 ping 网段
  • STM32CubeMX实战:定时器触发DAC+DMA生成高精度正弦波信号
  • 2026年十大热门人物、风景及插画图片素材网站精选盘点 - 品牌2025
  • 垃圾收集器ParNewCMS与底层三色标记算法详解
  • 2026届毕业生推荐的五大降AI率工具推荐榜单
  • GD32H7xx串口DMA收发不定长数据实战:以IDLE中断实现高效接收
  • 小白程序员必看!收藏这份AI大模型学习路线,轻松解锁高薪技能!
  • 集成AI 的 Redis 客户端 Rudist发布新版了庸
  • 无线通信工程师必备:如何用频谱分析仪精准测量Wi-Fi信号的信噪比?
  • AD202MV模拟输入模块
  • 云原生环境中的数据湖架构
  • [特殊字符] 第48课:二叉树展开为链表
  • WordPress主题实用指南(最新完整版)
  • Comsol 换流变压器电场计算模型:探索交直流工况下的电势与电场分布
  • C++元编程库简介:Boost.MPL与Brigand
  • PD协议学习二
  • 从文本分类到股价预测:BiLSTM的5个实战应用场景与TensorFlow 2.x实现对比
  • 旅行商问题五大经典算法实战对比:从理论到代码实现
  • TI F28P65X开发板实战:CPU Timer精准定时与LED控制
  • (四大天王)Python程序设计之四大核心数据结构:集合篇
  • 4月8日
  • 不写代码也能玩转智能家居:用App Inventor为ESP8266+Alexa项目做个控制App
  • C++编程中的异常处理机制:try/catch/throw详解
  • 从踩坑到解决:Flutter 鸿蒙 hap 编译与插件实战全指南
  • C++的std--ranges算法自定义比较器与等价关系在集合
  • 别再吹牛了,% Vibe Coding 存在无法自洽的逻辑漏洞!贤
  • 2026成都装修公司全攻略:怎么选、哪家好、靠谱推荐与区域精选 - 推荐官
  • 炸了!Claude Code终于补上最大短板:MEMORY.md让它第二天还记得你