- By test - In 巴西世界杯大名单
算法之美:两数之和
纠正:运算 表达错误 改为数组内容是否允许重复。后端开发成长指南
专注C++/Golang/Rust 后端技术实战, 提供源码解析、架构设计及大厂面试流程深度拆解, 助力开发者从基础进阶架构师
98篇原创内容
公众号
,时长05:16
一、 刷题选做什么准备吗?•准备一个白纸
•断网
•25 分钟倒计时
画外音:25 分钟限制
•相信你足够知识:
遇到不会,不需要急匆匆 打开浏览器搜索各种答案,
你感觉难,别人感觉难,分析这个题目,最坏结果做不出来。不浪费大量时间使用浏览器搜索答案。
•无条件支持:不要想着成为(对面是)大厂,名校,总监,领导 才可以做
在这个赛道上,他们不是 你对手,他们根本不敢参与。他们没这个时间,只要你愿意就可以
•先完成,在完美:千万不要想太复杂,用巧妙解法,复杂的思路就是不是好思路,直接放弃
二、通过口述方式 让别人不看文字,能理解题目要求【听不懂题目就做不出来】面试官描述:LC01:1. 两数之和给定一个整数数组 nums 和一个整数目标值 target,
请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
要求:
•请自己设计函数原型 和测试用例,在编译器中独立运行
听清楚后然后反问:•多个符合条件的怎么处理?
•数组有序吗?
•数组值重复吗?
编号
输入数组
目标值
期望输出
1
[1, 2, 3, 4, 5, 6]
6
[[0, 4], [1, 3]]
•小提示:可能返回多个多个值,并且下标[0,4] [4,0] 不允许重复返回
测试编号
输入数组
目标值
期望输出(所有满足两数之和等于目标的下标对)
2
[1, 1, 1, 2, 2, 2]
3
[[0, 3], [1, 3], [2, 3], [0, 4], [1, 4], [2, 4], [0, 5], [1, 5], [2, 5]]
•小提示:当元素重复时候,eg 返回当 index=4 时候
编号
输入数组
目标值
期望输出下标对
1
[1, 1, 1, 2, 2, 2]
3
[[0, 3], [1, 3], [2, 3], [0, 4], [1, 4], [2, 4], [0, 5], [1, 5], [2, 5]]
2
[1, 2, 3, 4, 5, 6]
6
[[0, 4], [1, 3]]
3
[2, 2, 2]
4
[[0, 1], [0, 2], [1, 2]]
4
[1, 5, 7, -1, 5]
6
[[0, 1], [1, 3], [3, 4]]
三、思路:采用什么数据结构与算法。方法
思路简介
时间复杂度
空间复杂度
优缺点
暴力法
双层循环遍历所有元素对,判断是否满足和为目标值
O(n²)
O(1)
简单直观,无需额外空间;但效率低,不适合大数组
哈希表法
遍历数组,用哈希表存储元素及其下标,查找补数
O(n)
O(n)
时间效率高,代码简洁;需要额外哈希表空间
排序+双指针法
先排序(保存原下标),再用双指针从两端寻找满足条件的对
O(n log n)
O(n)
可排序跳过重复元素方便去重;时间复杂度高于哈希法
用途 🎯
推荐使用场景 ✅
典型例题示例 🧩
学习目标 🎓
适合人群 👤
新手入门
🟩 LeetCode 原题(两数之和 LC01)
nums = [2,7,11,15], target = 9 → [0,1]
理解题意、数组遍历、哈希查找
刚学编程、算法零基础
初级算法课练习
🟨(含重复元素)+ 🟦(求多组解)
nums = [1,1,2,3,4,5], target = 6 → [(1,5),(2,4)]
认识重复值的处理、多解去重逻辑
已学数组+哈希,有刷题经验
高阶算法训练营
🟥(重复 + 多解 + 下标组合)
返回所有下标组合,如 [0,5], [1,5], [2,4]
数据结构灵活运用,边界条件抽象建模
算法进阶者、考研、竞赛、面试高频
面试准备
🟩 + 🟨(基础 + 重复处理)+ 偶尔🟦
提问 “如果输入有两个 3 怎么处理?”
熟练掌握常见变种,手写哈希逻辑
1~3 年经验面试选手
面试官出题
🟦 + 🟥(考察建模 & 思维)
“返回所有不重复下标组合” + “不能排序”
考查抽象能力、空间时间复杂度平衡
中高级程序员、架构师方向
四、代码实现c++版本(支持重复元素)图片
完整代码
•
https://github.com/watchpoints/noi_and_leetcode/blob/main/leetcode/array/lc1.cpp
Rust版本(不支持重复元素)代码语言:javascript代码运行次数:0运行复制use std::collections::HashMap;
impl Solution {
//我必须立刻押注 Rust
// @微信公共号: 后端开发成长指南
// @微信: watchpoints
pub fn two_sum(nums: Vec
let mut hash_map = HashMap::new(); //key nums[i],value i
for (index,&key) in nums.iter().enumerate() {
if let Some(&j) = hash_map.get(&(target-key)) {
return vec![j as i32 ,index as i32]
}
hash_map.insert(key,index);
}
return vec![]
}
}
参考•左耳朵耗子叔叔 https://github.com/haoel/leetcode
•https://github.com/youngyangyang04/leetcode-master
•https://programmercarl.com/
•宫水三叶刷题日记https://www.acoier.com/
•ppt 版本 https://github.com/liweiwei1419/LeetCode-Solution-PPT
您的点赞,转发 将是我最大的写作动力!