问题描述:给定一个整数集合和一个目标和,判断是否存在一个子集,使得该子集的和等于目标和
实现步骤
- 从集合中选择一个元素,尝试加入当前子集
- 检查当前子集的和是否等于目标和
- 如果等于目标和,则找到解
- 如果不等于,继续尝试剩下的元素
- 如果当前子集和超过目标和或所有元素都尝试过,则回退到上一步,尝试其他元素
分析:
- 时间复杂度: O(2^n),因为需要尝试所有可能的子集,其中 n 是集合的大小
- 空间复杂度: O(n),因为递归调用栈的深度可能需要遍历全部数据
实现代码
function subsetSum(nums, target) {
function backtrack(start, currentSum) {
if (currentSum === target) return true;
if (currentSum > target) return false;
for (let i = start; i < nums.length; i++) {
if (backtrack(i + 1, currentSum + nums[i])) {
return true;
}
}
return false;
}
return backtrack(0, 0);
}
let nums = [3, 34, 4, 12, 5, 2];
let target = 9;
console.log(subsetSum(nums, target)); // 输出: true