组合总和 II(dfs,leetcode40)-------------------c++实现

该博客介绍了一种使用深度优先搜索(DFS)解决LeetCode第40题的问题,即找到给定候选数字集合中所有和为目标值的唯一组合。文章详细解释了如何通过DFS算法,并通过避免重复元素来确保结果的唯一性。提供了C++实现的AC代码,并附带了样例输入和输出,以及解题思路和关键点。

组合总和 II(dfs,leetcode40)-------------------c++实现

题目表述

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次 。

注意:解集不能包含重复的组合。

样例

输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]
输入: candidates = [2,5,2,1,2], target = 5,
输出:
[
[1,2,2],
[5]
]

条件

1 <= candidates.length <= 100
1 <= candidates[i] <= 50
1 <= target <= 30

思路

用到的方法还是深搜,但是有一个新的知识点,就是,如果有多个重复点但是搜索的时候需要没有重复组合,则需要一种判断方法:
如果该点和前一个点值相同但是前一个点没有被加入结果队列,则不把该点加入结果队列。
用空间换时间 结果很理想。
在这里插入图片描述

注意点

注意第一层循环,与前一个值相同则直接跳。

ac代码

c++:
class Solution {
public:
          void dfs(vector<int>& candidates,vector<vector<int>> &result,vector<int> &now,int i,int &target,int &sum)
          {
            
              for(int j=i+1;j<candidates.size();j++)
              {
                  if(candidates[j-1]==candidates[j]&&((j-1)!=i))
                           continue;                  //和前一位相同且前一位没入队列,则该数也不如队列.

                  if(sum+candidates[j]>=target)
                  {
                      if(sum+candidates[j]==target)
                        {
                            now.push_back(candidates[j]);
                         result.push_back(now);
                         now.pop_back();
                        }
                        break;
                  }
                  sum+=candidates[j];
                  now.push_back(candidates[j]);
                  dfs(candidates,result,now,j,target,sum);
                  sum-=candidates[j];
                  now.pop_back();
              }
              return;
          }

    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
             sort(candidates.begin(),candidates.end());
             vector<vector<int>> result;
             vector<int> now;
             int sum=0;
             for(int i=0;i<candidates.size();i++)
             {                                             //选第一个数
                   if(i>0&&candidates[i-1]==candidates[i])
                           continue;
                 if(candidates[i]>=target)
                 { 
                     if(candidates[i]==target)
                           {
                            now.push_back(candidates[i]);
                           result.push_back(now);
                           }
                           break;
                 }
                  sum+=candidates[i];
                  now.push_back(candidates[i]);
                  dfs(candidates,result,now,i,target,sum);
                  sum-=candidates[i];
                  now.pop_back();
             }
             return result;
    }
};

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值