1.背景:刷leetcode 216题

2.第一次提交的func combinationSum3(k int, n int) [][]int {

result := new([][]int)
	var array []int
	getInt(result, n, k, 9, array, 0)
	return *result
}

//
func getInt(result *[][]int, n, k, now int, nowArray []int, num int) {
	//跳出条件数组长度等于k的时候跳出,不管是否成功
	if len(nowArray) == k {
		if num == n {
			x := make([]int, k)
			copy(x, nowArray)
			*result = append(*result, x)
		}
		return
	}
	for i := now; i >= 1; i-- {
		//当nowArray
		if num+i <= n {
			nowArray = append(nowArray, i)
			getInt(result, n, k, i-1, nowArray, num+i)
			//还原nowArray
			nowArray = nowArray[:len(nowArray)-1]
		}
	}
}

3.第二次提交

func combinationSum3(k int, n int) [][]int {
	result := [][]int{}

	var array []int
	getInt(&result, n, k, 9, array, 0)
	return result
}

//
func getInt(result *[][]int, n, k, now int, nowArray []int, num int) {
	//跳出条件数组长度等于k的时候跳出,不管是否成功
	if len(nowArray) == k {
		if num == n {
			x := make([]int, k)
			copy(x, nowArray)
			*result = append(*result, x)
		}
		return
	}
	for i := now; i >= 1; i-- {
		//当nowArray
		if num+i <= n {
			nowArray = append(nowArray, i)
			getInt(result, n, k, i-1, nowArray, num+i)
			//还原nowArray
			nowArray = nowArray[:len(nowArray)-1]
		}
	}
}

4.第一次result是指针平均时间4ms,第二次是数组平均时间是0ms

我以为数组和指针在进行拼接的时间性能差距很大,问了chatgpt,说确实存在性能差距,让他给了个demo

import (
	"fmt"
	"testing"
)

func BenchmarkAppendPointer(b *testing.B) {
	var result [][]int
	for i := 0; i < b.N; i++ {
		x := make([]int, 0)
		result = append(result, x)
	}
}

func BenchmarkAppendSlice(b *testing.B) {
	result := [][]int{}
	for i := 0; i < b.N; i++ {
		x := make([]int, 0)
		result = append(result, x)
	}
}

func main() {
	// 比较使用指针和切片的追加操作性能
	fmt.Println("Benchmark Append Pointer:")
	fmt.Println(testing.Benchmark(BenchmarkAppendPointer))
	fmt.Println("Benchmark Append Slice:")
	fmt.Println(testing.Benchmark(BenchmarkAppendSlice))
}

在这里插入图片描述

5.结论

运行了3次,执行结果来看确实有性能差距,但是差距没那么大应该是leecode问题,日常开发还是需要注意的
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐