Go语言LeetCode两数之和:切片赋值效率对比
本文分析两种Go语言实现LeetCode两数之和问题的代码,探讨切片赋值方式对运行时间的影响。
代码实现一:预先分配切片
func twosum(nums []int, target int) []int { m := make(map[int]int) l := make([]int, 2, 2) // 预先分配长度和容量为2的切片 for firstindex, firstvalue := range nums { difference := target - firstvalue if lastindex, ok := m[difference]; ok { l[0] = firstindex l[1] = lastindex return l } m[firstvalue] = firstindex } return nil }
代码实现二:直接赋值切片
func twoSum(nums []int, target int) []int { m := map[int]int{} for firstIndex, firstValue := range nums { difference := target - firstValue if lastIndex, ok := m[difference]; ok { return []int{firstIndex, lastIndex} // 直接创建并返回切片 } m[firstValue] = firstIndex } return nil }
测试结果显示,代码实现二的运行时间约为代码实现一的3倍。 这并非由于切片长度和容量设置差异导致,因为两种方法都将切片长度和容量设置为2。
性能差异分析
LeetCode评测系统的测试用例和运行环境会影响执行时间。即使是相同的代码,在不同时间提交,结果也可能不同。 两种代码的逻辑差异很小,因此性能差异可能源于以下方面:
切片创建开销: 代码实现二在每次找到结果时都创建一个新的切片[]int{firstIndex, lastIndex},这会带来额外的内存分配和复制开销。 而代码实现一预先分配了切片,避免了重复创建。
垃圾回收: 代码实现二频繁创建并返回新的切片,导致更多的垃圾回收工作,从而增加了运行时间。
编译器优化: 编译器对两种代码的优化程度可能存在差异。
因此,虽然两种方法在功能上等效,但代码实现一(预先分配切片)在性能上更优,因为其减少了运行时的内存分配和垃圾回收的压力。 这在处理大量数据时尤为重要。
以上就是LeetCode两数之和:切片直接赋值比预先分配更耗时?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号