力扣刷题494. 目标和
494. 目标和 - 力扣(LeetCode)
方法一,暴力dfs
直接进行深搜查找出所有的情况,缺点严重超时,只能过20个案例
留一下超时的
class Solution {
//首先定义全局变量
int[] abs = { +1, -1 }; //用来记录当前遍历的数的正负
List<List<Integer>> list; //所有的结果
List<Integer> res; //记录当前的结果
public int findTargetSumWays(int[] nums, int target) {
//初始化
res = new LinkedList<>();
list = new ArrayList<>();
dfs(nums, target, 0, 0);
return list.size();
}
//可直接套用dfs模版
public void dfs(int[] nums, int target, int sum, int index) {
//如果满足条件则把当前的记录加入所有的结果当中
if (res.size() == nums.length && sum == target) {
list.add(new ArrayList<>(res));
return;
}
//从index进行遍历,避免遍历重复数据
for (int i = index; i < nums.length; i++) {
//遍历数字的正负两种情况
for (int j = 0; j < 2; j++) {
int x = nums[i] * abs[j];
res.add(x);
dfs(nums, target, sum + x, i + 1);
//剪枝,移除最后的数据
res.remove(res.size() - 1);
}
}
}
}
dfs优化: 可通过
因为这一道题不需要记录所有的方法,只需要统计一共的个数,所以可以进行优化
class Solution {
//定义全局变量
int count = 0;
public int findTargetSumWays(int[] nums, int target) {
count = 0;
dfs(nums, target, 0, 0);
return count;
}
public void dfs(int[] nums, int target, int sum, int index) {
if (index == nums.length) {
//这里的if不能合并,因为不管sum满不满足条件,都需要回溯
if (sum == target) {
count++;
}
return;
}
//当前数为正数
dfs(nums, target, sum + nums[index], index + 1);
//当前数为负数
dfs(nums, target, sum - nums[index], index + 1);
}
}