小F的算法世界(LeetCode 热题 100)

小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头疼的是,他应该使用什么逻辑解答这个问题。


暴力枚举

首先它先想到的是 暴力枚举,直接使用小学数学的知识一个一个加着试试看

输入数组 nums 和目标值 target
遍历数组 nums 的每一个元素 currentValue
是否找到 target - currentValue
返回 firstIndex 和 secondIndex
继续遍历
遍历结束
返回 nil
结束
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意识到当前方法的运行时间较长,于是他想到了哈希表。他还记得通过将数组中的元素存储在哈希表中,可以快速查找和匹配元素,避免重复计算。这种方法虽然增加了空间复杂度,但可以减少时间复杂度,也就是所谓的“空间换时间”策略。

初始化哈希表: hashTable
遍历数组 nums 的每一个元素 currentValue
哈希表中是否存在 target - currentValue
返回索引: (firstIndex, complementIndex)
将 currentValue 和其索引 firstIndex 存入哈希表
继续下一次遍历
结束
遍历结束
返回 nil
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又该如何应对呢?

未完待续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fenderisfine

蟹蟹你的奶茶😘

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值