小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又该如何应对呢?

未完待续......