LeetCode 39. 组合总和

题目描述

39. 组合总和

image-20250419031842243

image-20250419031857326

思路分析

思路描述

image-20250508030637806

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
func combinationSum(candidates []int, target int) [][]int {
	var res [][]int
	var path []int

	var backtrack func(start, curSum int)

	backtrack = func(start, curSum int) {
		if curSum == 0 {
			res = append(res, append([]int{}, path...))
			return
		}

		for i := start; i < len(candidates); i++ {
			if candidates[i] > curSum {
				continue
			}

			path = append(path, candidates[i])
			backtrack(i, curSum-candidates[i])
			path = path[:len(path)-1]
		}
	}

	backtrack(0, target)

	return res
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
func combinationSum(candidates []int, target int) [][]int {
	var res [][]int
	var path []int

	// 回溯函数
	var backtrack func(start, target int)
	backtrack = func(start, target int) {
		// 如果目标为 0,说明找到了一个组合
		if target == 0 {
			res = append(res, append([]int{}, path...))
			return
		}

		// 遍历 candidates 数组中的每个数
		for i := start; i < len(candidates); i++ {
			// 剪枝:如果当前数已经大于 target,直接跳出
			if candidates[i] > target {
				continue
			}
			// 选择当前数
			path = append(path, candidates[i])
			// 递归选择下一个数
			backtrack(i, target-candidates[i])
			// 回溯,移除当前数
			path = path[:len(path)-1]
		}
	}

	backtrack(0, target)
	return res
}
  • 时间复杂度:O(2^n)
  • 空间复杂度:O(target)

➡️ 点击查看 Java 题解

1
write your code here
本文作者:
本文链接: https://hgnulb.github.io/blog/2025/47745585
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!