小哆啦解题记——两数失踪事件

📅 2025-07-08|Day 36

题号:1. 1. 两数之和 - 力扣(LeetCode)

关键词:暴力枚举、哈希表、Map 缓存、空间换时间


第一章:失踪的目标值

"哆啦A梦,数学卷子上有个神秘问题------老师说数组里藏着两位同学,他们的成绩之和是 100,问我他们是谁!"

大雄紧握试卷,皱着眉头看着:

ini 复制代码
nums = [18, 43, 7, 85, 23, 77];
target = 100;

"我只能想到最笨的方法:把所有组合都试一遍!"


第二章:暴力破解的拙计

大雄掏出"暴力枚举放大镜",开始排查:

ini 复制代码
function bruteForceTwoSum(nums: number[], target: number): number[] {
    for (let i = 0; i < nums.length; i++) {
        for (let j = i + 1; j < nums.length; j++) {
            if (nums[i] + nums[j] === target) {
                return [i, j];
            }
        }
    }
    return [];
}

测试一下:

scss 复制代码
bruteForceTwoSum([18, 43, 7, 85, 23, 77], 100); // 输出:[1, 2]

🌪️结果倒是能跑,但每个循环就像大雄翻试卷,把所有可能都翻个底朝天。

时间复杂度:O(n²),当数据多起来时,CPU 风扇会先喘气。


第三章:哈希侦探的秒杀

"暴力太慢,我们该请出聪明的哆啦神探------哈希表。"

哆啦A梦掏出一张记忆面板:"我可以在查阅过的数字旁边贴上便签!"

作战思路:

  • 遍历数组
  • 对于每个数 nums[i],判断是否存在 target - nums[i] 已经出现在 map 中
  • 如果存在,说明这俩数加起来正好是目标!
ini 复制代码
function twoSum(nums: number[], target: number): number[] {
    let sMap: Map<number, number> = new Map();
    for (let i = 0; i < nums.length; i++) {
        if (sMap.has(target - nums[i])) {
            return [sMap.get(target - nums[i])!, i];
        }
        sMap.set(nums[i], i);
    }
    return [];
}

测试用例:

scss 复制代码
twoSum([18, 43, 7, 85, 23, 77], 100); // 输出:[1, 2],因为 43 + 57 = 100

第四章:算法现场模拟剧

🎭 大雄模拟过程如下:

  • i=0,nums[0]=18,target - 18 = 82,sMap中没有 → 插入 18:0
  • i=1,nums[1]=43,target - 43 = 57,没有 → 插入 43:1
  • i=2,nums[2]=7,target - 7 = 93,没有 → 插入 7:2
  • i=3,nums[3]=85,target - 85 = 15,没有 → 插入 85:3
  • i=4,nums[4]=23,target - 23 = 77,没有 → 插入 23:4
  • i=5,nums[5]=77,target - 77 = 23 ✅ 找到了!

🔍 成功匹配:[4, 5]


第五章:暴力与哈希的性能对决

解法 时间复杂度 空间复杂度 是否推荐
暴力双循环 O(n²) O(1)
哈希 Map 缓存法 O(n) O(n) ✅ 强烈推荐

哈希就像哆啦A梦的四维记忆相册:谁来过、存在哪儿、全都一目了然!


📌 技术启示录:

  • 时间换空间,换来的就是速度感知的巨大跃迁。
  • 哈希表是查找问题里的核武器------凡是"某个东西是否存在",先考虑 Map。
  • 哈希查找是 O(1),而暴力是 O(n),数据量越大,差距越明显。

🌌 终章:配对的浪漫哲学

哆啦A梦拍了拍大雄肩膀:

"有时候两个看似毫无关联的数字,

在对的目标下,会碰撞出最美的答案。"

大雄望着 77 和 23 的下标组合,若有所思:

"原来,'和你一起,正好合适',在算法里也一样浪漫。"

相关推荐
侯小啾15 分钟前
【03】C语言 强制类型转换 与 进制转换
c语言·数据结构·算法
冰暮流星35 分钟前
css之线性渐变
前端·css
Xの哲學38 分钟前
Linux NAPI 架构详解
linux·网络·算法·架构·边缘计算
徐同保40 分钟前
tailwindcss暗色主题切换
开发语言·前端·javascript
mapbar_front44 分钟前
大厂精英为何在中小公司水土不服?
前端
生莫甲鲁浪戴1 小时前
Android Studio新手开发第二十七天
前端·javascript·android studio
2501_916008893 小时前
Web 前端开发常用工具推荐与团队实践分享
android·前端·ios·小程序·uni-app·iphone·webview
SkylerHu4 小时前
前端代码规范:husky+ lint-staged+pre-commit
前端·代码规范
菜鸟una4 小时前
【微信小程序 + 消息订阅 + 授权】 微信小程序实现消息订阅流程介绍,代码示例(仅前端)
前端·vue.js·微信小程序·小程序·typescript·taro·1024程序员节
牛客企业服务4 小时前
企业招聘新趋势:「AI面试」如何破解在线作弊难题?
人工智能·面试·职场和发展·招聘·ai招聘