当前位置: 首页> 文旅> 艺术 > 力扣39. 组合总和

力扣39. 组合总和

时间:2025/7/13 13:10:02来源:https://blog.csdn.net/LNsupermali/article/details/139608845 浏览次数:0次

Problem: 39. 组合总和

文章目录

  • 题目描述
  • 思路及解题方法
  • 复杂度
  • Code

题目描述

在这里插入图片描述在这里插入图片描述

思路及解题方法

1.创建一个 res 变量存储所有满足条件的组合结果,使用 track 变量记录当前的组合路径,使用 trackSum 变量记录当前路径中元素的和。

2.回溯方法 backtrack:

2.1.基本情况1:如果 trackSum 等于目标 target,则将当前路径 track 添加到结果 res 中,并返回。
2.2.基本情况2:如果 trackSum 大于目标 target,则直接返回。

3.循环与选择:

3.1.循环从 start 位置开始遍历 nums 数组。
3.2.将当前元素添加到 track 中,并更新 trackSum。
3.3.递归调用 backtrack 方法,并将 start 位置保持为 i,允许重复选择当前元素。
3.4.回溯:从 track 中移除最后一个元素,并更新 trackSum,以便尝试其他组合。

复杂度

时间复杂度:

O ( 2 N ) O(2^N) O(2N);其中 N N N为数组candidates的长度

空间复杂度:

O ( N × 2 N ) O(N \times 2^N) O(N×2N)

Code

class Solution {List<List<Integer>> res = new LinkedList<>();// Record the backtracking pathLinkedList<Integer> track = new LinkedList<>();// Record the path sum in trackint trackSum = 0;/*** Combination Sum** @param candidates Given array* @param target     Given number* @return List<List < Integer>>*/public List<List<Integer>> combinationSum(int[] candidates, int target) {if (candidates.length == 0) {return res;}backtrack(candidates, 0, target);return res;}/*** Backtracking functions implement functions** @param nums   Given array* @param start  Decision stage* @param target Given number*/private void backtrack(int[] nums, int start, int target) {// base case, find the target and record the resultif (trackSum == target) {res.add(new LinkedList<>(track));return;}// base case, exceed the target sum, stop the downward traversalif (trackSum > target) {return;}for (int i = start; i < nums.length; ++i) {trackSum += nums[i];track.add(nums[i]);backtrack(nums, i, target);trackSum -= nums[i];track.removeLast();}}
}
关键字:力扣39. 组合总和

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: