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

3-sum 问题 - liyan

从 3-sum 问题开始说起

3-sum 问题是 leetcode 中的一个经典问题。笔者最近重新重新回顾了这个问题,尴尬的是
关键时刻居然没有解出来。今天来重新回顾下。作为数组类问题中的经典问题,笔者认为这里有三个关键点:

  1. 记得排序。数组问题大多需要进行排序,有序的数组才具有可操作性。
  2. 通过比较,来决定下标移动的位置。在处理 2-sum 过程时,比较当前下标数字的和与目标值的大小来决定下标的下一步移动方向。
  3. 对去重的处理。尴尬的就是这部分的处理过程。以笔者目前写代码的习惯,会直接使用 set 来进行去重。翻了下代码,对这部分的处理确实有点绕。

围绕第三点,下面给出两个解法。

set 去重

先看第一种解法,在处理结果集不重复时,使用 HashSet 来处理结果集唯一性的问题:

impl Solution {pub fn three_sum_n(mut nums: Vec<i32>, sum: i32) -> Vec<Vec<i32>> {nums.sort();let mut res = std::collections::HashSet::new();for i in 0..nums.len() {let target = sum - nums[i];let mut left = i + 1;let mut right = nums.len() - 1;while left < right {if nums[left] + nums[right] == target {// 题目中要求的时结果集不重复。直接使用 set 来保证唯一性。res.insert(vec![nums[i], nums[left], nums[right]]);// 找到一个后,同时移动 left & right 后继续遍历left += 1;right -= 1;continue;}if nums[left] + nums[right] > target {right -= 1;} else {left += 1;}}}res.into_iter().collect()}pub fn three_sum(mut nums: Vec<i32>) -> Vec<Vec<i32>> {Self::three_sum_n(nums, 0)}
}

通过比较来去重

第二种解法也是经典解法:在移动下标时,确保当前值和前一个值不同。笔
者回顾了下自己的思路以及给候选人的建议:先进行去重,然后进行比对。
先去重的问题就是,像 [0, 0, 0] 这样的结果就会先被去重环节排除
掉。而题目中没有结果集中的 [x, y, z] x != y && y != z 的条件。
正确的去重方式应该是,通过后置位和前置位的对比来允许 [0, 0, 0]的
候选集能够出现。解题过程如下:

impl Solution {pub fn three_sum_n(mut nums: Vec<i32>, sum: i32) -> Vec<Vec<i32>> {nums.sort();let mut res = vec![];for i in 0..nums.len() {// 同样需要对 i 进行去重处理if i != 0 && nums[i] == nums[i-1]{continue;}let target = sum - nums[i];let mut left = i + 1;let mut right = nums.len() - 1;while left < right {// 允许第一个 left 值继续处理。第二个值和前置值对比if left != i + 1 && nums[left] == nums[left - 1] {left += 1;continue;}// 允许第一个 right 值继续处理。第二个值和前置值对比if right != nums.len() - 1 && nums[right] == nums[right + 1] {right -= 1;continue;}if nums[left] + nums[right] == target {res.push(vec![nums[i], nums[left], nums[right]]);// 找到一个后,同时移动 left & right 后继续遍历left += 1;right -= 1;continue;}if nums[left] + nums[right] > target {right -= 1;} else {left += 1;}}}res}pub fn three_sum(mut nums: Vec<i32>) -> Vec<Vec<i32>> {Self::three_sum_n(nums, 0)}
}

一些感想

最近接触了很多实习生,感觉现在的实习生实力都很强。笔者找工作时,简历里的项目只有小学期的一个项目以及实验室里的一个项目,而且工程量都很小。现在
的候选人都可以在网上找一些开源项目的教程项目来学习了,而且给开源项目提 PR 的能力也很强。确实超过笔者很多。
另一点感想是,学校所在的城市对学生的工程能力还是有影响的:北上的研究生工程实践都很多,而且普遍对工程涉及的一些项目(Redis, ES等)都有一些了解。
而非大厂所在城市的学校,研究生跟着导师做的项目普遍偏学术,而且对工程的了解要少很多。这确实是地利带来的影响,而且确实对候选人的面试有很大的影响。
还是应该通过适当的实习来接触行业。同样的,工作了也需要不断的提升自己的视野面。

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

相关文章:

  • emacs! start org-mode! --org-mode使用备注 - liyan
  • python调试方法(其一) - liyan
  • CLI-Anything + Gear 最佳实践与踩坑修复沉淀
  • ratelimit服务流量限制 - liyan
  • 北京卡地亚维修、深圳爱彼保养、杭州万国检修|6城高端腕表维修科普指南 - 时光修表匠
  • windows用户有哪些必备的小工具软件能大幅提高效率而且占用资源低?
  • web中各个标签的关系
  • CF2208D1,D2 Tree Orientation (Easy,Hard Version) Solution
  • 2026年3月偏心半球阀批发厂家排行榜单,优质源头厂推荐,偏心半球阀厂家技术领航者深度解析 - 品牌推荐师
  • 上海积家维修、深圳宝玑保养、南京昆仑检修|6城高端腕表维修科普指南 - 时光修表匠
  • 百考通精准贴合学生写作痛点,打造“一站式”毕业论文服务体系
  • 学习笔记+ZY_75843《机器人操作系统(ROS2)入门与实践 》_刘相权等+记录
  • 告别学术焦虑:百考通AI,覆盖从“降AI痕迹”到“降重复率”的全场景需求
  • 网络流 学习笔记(施工中)
  • 守住学术原创底线!百考通AIGC检测,筑牢学术原创防线,为论文合规性保驾护航
  • 直接上结论:10个AI论文网站测评!继续教育毕业论文写作必备工具推荐
  • 百考通AI:让文献综述从繁琐的体力劳动,转变为高效的学术洞察过程
  • LongFact:评估LLM长文本事实性的基准测试
  • 稳压泵实力厂家2026年新动态,一文速览,排污泵/恒压变频供水设备/消防泵/消防水箱/玻璃钢水箱,稳压泵公司有哪些 - 品牌推荐师
  • 百考通精准贴合不同学历层次的学术需求,实现了从选题到成文的全流程赋能
  • cpp的模块配置
  • EasyCPP2
  • 关于HTML5的一些基础认知
  • 深圳宝珀维修、上海朗格保养、南京积家检修|6城高端腕表维修科普指南 - 时光修表匠
  • 阅读进度管理程序,设定目标自动计算每日页数,提醒打卡,提高读完率,不半途而废。
  • 北京格拉苏蒂维修、杭州雅克德罗保养、无锡法穆兰检修|6城高端腕表维修科普指南 - 时光修表匠
  • 台州宠物腹腔镜绝育:这些医院值得一试,异宠/宠物眼科/宠物腹腔镜绝育/狗狗体检/宠物内科/宠物骨科,宠物绝育医生选哪家 - 品牌推荐师
  • QQ机器人接入OpenClaw完整指南:从零开始打造你的智能助手
  • KDT 小记
  • 杭州宝玑维修、无锡帝舵保养、北京朗格检修|6城高端腕表维修科普指南 - 时光修表匠