Leetcode 39. 组合总和(DAY 86) ---- Leetcode Hot 100


原题题目


在这里插入图片描述


代码实现(首刷自解)


class Solution {
public:

    vector<int> temp;
    vector<vector<int>> ret;

    void backtracking(const vector<int>& candidates,vector<int>& temp,int startpos,int sum,int target)
    {
        if(sum == target)
        {
            ret.push_back(temp);
            return;
        }   
        
        for(int i=startpos;i<candidates.size();++i)
        {
            int num = candidates[i];
            if(sum+num<=target)
            {
                temp.push_back(num);
                backtracking(candidates,temp,max(startpos,i),sum+num,target);
                temp.pop_back();
            }
        }
    }

    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        backtracking(candidates,temp,0,0,target);
        return ret;
    }
};

代码实现(二刷自解 DAY 239 C++)


class Solution {
public:
    void backtracking(vector<vector<int>>& ret,vector<int>& arr,vector<int>& tmp,int target,int tmpsum,int pos)
    {
        if(tmpsum == target)
        {
            ret.emplace_back(tmp);
            return;
        }
        
        if(tmpsum > target || pos == arr.size())
            return;

        int size = arr.size();
        auto sum = tmpsum;
        for(int i = pos;i < size;++i)
        {
            auto tmpsum = sum;
            int times = 0;
            for(;tmpsum <= target;++times)
            {
                tmpsum += arr[i];
                tmp.emplace_back(arr[i]);
                backtracking(ret,arr,tmp,target,tmpsum,i + 1);
            }

            while(times--)      tmp.pop_back();
        }
        return;
    }

    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<vector<int>> ret;
        vector<int> tmp;

        backtracking(ret,candidates,tmp,target,0,0);

        return ret;
    }
};

代码实现(三刷自解 DAY 288 C++)


class Solution {
 public:
  void BackTracking(vector<vector<int>>& ret, vector<int>& candidates, vector<int>& tmp, int target, int index, int sum) {
    if (sum >= target) {
      if (sum == target) {
        ret.emplace_back(tmp);
      }
      return;
    } 

    for (int i = index; i < candidates.size(); ++i) {
      tmp.emplace_back(candidates[i]);
      BackTracking(ret, candidates, tmp, target, i, sum + candidates[i]);
      tmp.pop_back();
    }
  }

  vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
    vector<vector<int>> ret;
    vector<int> tmp;

    BackTracking(ret, candidates, tmp, target, 0, 0);
    return ret;
  }
};

代码实现(四刷自解 DAY 8 Golang)


var ret [][]int
var tmp []int

func Backtracking(candidates []int, target, tmpsum, pos int) {
  if tmpsum > target {
    return
  }

  if target == tmpsum {
    copytmp := make([]int, len(tmp))
    copy(copytmp, tmp)
    ret = append(ret, copytmp)
    return
  }

  for i := pos; i < len(candidates); i++ {
    tmpsum += candidates[i]
    tmp = append(tmp, candidates[i])
    Backtracking(candidates, target, tmpsum, i)
    tmp = tmp[:len(tmp) - 1]
    tmpsum -= candidates[i]
  }
}

func combinationSum(candidates []int, target int) [][]int {
  ret = [][]int{}
  tmp = []int{}

  Backtracking(candidates, target, 0, 0)
  return ret
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Love 6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值