
LeetCode“两数之和”:切片分配效率差异分析
LeetCode的“两数之和”问题,两种看似相似的解法却在运行时间上存在显著差异。本文将分析其原因。
代码对比:
两种解法都实现了func twoSum(nums []int, target int) []int函数,但切片分配方式不同:
-
解法一: 预先分配一个长度和容量均为2的切片
l := make([]int, 2)存储结果。 -
解法二: 直接返回一个长度为2的切片字面量
[]int{firstIndex, lastIndex}。
性能差异及原因:
表面上看,解法二的切片分配更简洁。然而,关键在于LeetCode的测试环境和代码执行过程:
-
解法一: 切片
l在函数开始时即被创建并分配内存,后续测试用例复用该切片,避免了重复分配的开销。 -
解法二:
[]int{firstIndex, lastIndex}在每次函数调用时都会创建一个新的切片。对于大型测试集,频繁创建和销毁切片会产生明显的内存分配和垃圾回收开销,导致运行时间变长。
因此,虽然解法二代码更简洁,但在LeetCode的测试环境下,特别是面对大量测试用例时,解法一由于避免了重复的切片创建,展现出更高的效率。 这说明,即使是细微的代码差异,在特定环境下也可能导致显著的性能差异。 选择合适的内存分配策略对于优化代码性能至关重要。










