小F的算法世界
小F的算法世界(LeetCode 热题 100)
两数之和
情景引入
背景
小F是“程序员炒饭”的摊主😄 ,每天早上7点之前就要为当天晚上的热战备好米饭和配菜。今天,小F计划购买21.5斤米和7斤的配菜。当地大米价格约为2.5软妹币一斤,配菜包括胡萝卜、小葱和速食火腿肠等。
然而,小F今天的预算只有64软妹币(target),而且每种配菜他只能购买一次😕 。尽管如何哭诉,小F的女朋友都只给他64软妹币的限额。面对这个难题,小F决定发挥独属于程序员的机智,利用 LeetCode 上经典的第一题——“两数之和”,来解决这个问题。
小F掏出电脑,开始思考如何通过算法解决他的难题。
小F首先凭借经验列出了购物清单,把每样物品的价格组成了一个数组,而他今天的预算就是 target = 64
软妹币。现在,小F需要在清单中找到两项的价格组合,使得它们的总价刚好等于64元。
清单:
- 米饭:53.75软妹币
- 华子:45软妹币👀️
- 烟卡:4软妹币👀️
- 黑猴:268软妹币👀️
- 配菜:10.25软妹币
现在令小F头疼的是,他应该使用什么逻辑解答这个问题。
暴力枚举
首先它先想到的是 暴力枚举,直接使用小学数学的知识一个一个加着试试看
graph LR
A[输入数组 nums 和目标值 target] --> B[遍历数组 nums 的每一个元素 currentValue]
B --> C{是否找到 target - currentValue}
C -->|是| D[返回 firstIndex 和 secondIndex]
C -->|否| E[继续遍历]
E --> B
B --> F[遍历结束]
F --> G[返回 nil]
G --> H[结束]
func twoSum(nums []int, target int) []int {
for firstIndex, currentValue := range nums {
for secondIndex := firstIndex + 1; secondIndex < len(nums); secondIndex++ {
if x+nums[secondIndex] == target {
return []int{firstIndex, secondIndex}
}
}
}
return nil
}
复杂度分析
- 时间复杂度:O(N^2),其中 N 是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次。
- 空间复杂度:O(1)。
虽然 暴力枚举 解出来了,但是小F觉得这样解太丢猿脸了,根本不敢跟过往的同事们分享这个解法。
哈希表
小F意识到当前方法的运行时间较长,于是他想到了哈希表。他还记得通过将数组中的元素存储在哈希表中,可以快速查找和匹配元素,避免重复计算。这种方法虽然增加了空间复杂度,但可以减少时间复杂度,也就是所谓的“空间换时间”策略。
flowchart LR
B(["初始化哈希表: hashTable"])
B --> C(["遍历数组 nums 的每一个元素 currentValue"])
C --> D{{"哈希表中是否存在 target - currentValue"}}
D --> |是| E(["返回索引: (firstIndex, complementIndex)"])
D --> |否| F(["将 currentValue 和其索引 firstIndex 存入哈希表"])
F --> G(["继续下一次遍历"])
G --> C
E --> H(["结束"])
C --> I(["遍历结束"])
I --> J(["返回 nil"])
J --> H
func twoSum(nums []int, target int) []int {
hashTable := map[int]int{}
for firstIndex, currentValue := range nums {
if complementIndex, found := hashTable[target-currentValue]; found {
return []int{complementIndex, firstIndex}
}
hashTable[currentValue] = firstIndex
}
return nil
}
复杂度分析
- 时间复杂度:O(N),其中 N 是数组中的元素数量。我们遍历了整个数组,每个元素在哈希表中的查找和插入操作的时间复杂度都是 O(1)。
- 空间复杂度:O(N),其中 N 是数组中的元素数量。哈希表在最坏情况下需要存储 N 个元素。
引入哈希表后,小F发现运行速度确实快了好几倍,在小F准备关闭电脑收拾收拾出发时,发现自己的女朋友不知何时已经到了自己的跟前。小F这才意识到不对,赶紧关闭电脑。可是还是晚了一步,被女朋友发现了"不对劲"的购物清单👀️ ,随后就被处以了行政处罚,给拖回了搓衣板上。
今晚,小F又该如何应对呢?
未完待续......
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 Fender