看到题目首先想到了递归:
1、递归
递归参数:遍历到的数组位置,之前的表达式和。
递归结束:当遍历到数组最后一个位置时,判断此时的表达式和是否为target,若是res++,否则res不变。
递归体:之前的表达式和,分别+/-当前位置的数字,然后递归到下一个位置。
func findTargetSumWays(nums []int, target int) int {
var res int=0
var rec func(sum, pos int)
rec=func(sum, pos int){
if pos==len(nums){ // 遍历到最后一个位置
if sum==target{ res++ }
}else{
rec(sum+nums[pos], pos+1)
rec(sum-nums[pos], pos+1)
}
}
rec(0, 0)
return res
}
2、优化算法,降低时间复杂度:感觉递归就是一个变相的暴力遍历,想要降低复杂度需要合理的剪枝操作或者使用额外空间存储中间结果。
1)剪枝操作:由于对每一个数字可+也可以-,所以没有想到办法可以通过中间结果判断该种方法不可行,所以放弃剪枝的方法。
2)额外空间存储中间结果:
数据结构:二维数组,存储以当前序号 i 为终点,和为sum的所有情况数
算法:看答案也看懵了,之后再详细理解吧,今天累了。。。。😫