LeetCode 494 目标和

看到题目首先想到了递归:

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的所有情况数

算法:看答案也看懵了,之后再详细理解吧,今天累了。。。。😫

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值