LeetCode Hot100 DFS经典题型:组合总和

前言

最近再刷LeetCode的时候,写了一道DFS题型,发现这道题最难的就是去重,由于我做此类题型比较少,由此记录。
先上题目:组合总数

做法

这个题我们直接DFS暴力搜索一边就可以了,但是难点就是在与去除重复元素。

为什么需要去重

产生重复的原因是:由于题目中说 每一个元素可以重复使用,我们是从下标为0的数字开始遍历到,所以考虑了所有的数字,因此出现了重复的列表。

思路一

我们这里可以用哈希表来进行去重,但是可能会比较麻烦。

思路二

我们可以定义一个begin,for循环去寻找数的时候下标从begin开始寻找,就不会找到相同的元素了。
因为如果找之前的元素,必定会找到相同的集合。(因为之前的数已经被我们搜索过了,再去搜索就一定找到相同的集合)。

思路二分析

比如样例
在这里插入图片描述

  1. 我们首先从下标为0的数字开始搜索,也就是2。
  2. 一直往下搜,直到target为0或者小于0的时候return。
  3. return回来之后,搜索下一个下标,也就是1。
  4. 假设发现target=0,加入到答案。
  5. 之后一直搜。当cur集合的第一个元素的下标为1的时候(也就是3的时候),说明以下标为0的数开头的集合已经被搜完了,尝试搜索集合首元素为第1个下标的数字,也就是3。
  6. 重点:此时由于我们是从左往右进行搜索的,所以下标为1之前的所有的数字我们都已经搜索过了,所以我们直接从自身之后开始搜索就可以了。也就是对于begin变量。
class Solution {
    
    
public:

    vector<vector<int>> ans;

    vector<vector<int>> combinationSum(vector<int>& a, int target) {
    
    
        vector<int> cur;
        dfs(a, cur, target, 0);
        return ans;
    }

    void dfs(vector<int>& a, vector<int>& cur, int target, int begin){
    
    
        if(target == 0){
    
    
            ans.push_back(cur);
            return;
        }
        if(target < 0) return;
        for(int i = begin; i < a.size(); i++){
    
    
            cur.push_back(a[i]);
            dfs(a, cur, target - a[i], i);
            cur.pop_back();
        }
    }
};

在这里插入图片描述

剪枝优化

假设当前序列是有序的。
那么当target小于0的时候,我们就不需要继续搜索了,直接return就可以了。
当然还得具体看情况,因为排序也需要时间。
所以就看排序剪枝效率高还是直接搜素效率高了。

class Solution {
    
    
public:

    vector<vector<int>> ans;

    vector<vector<int>> combinationSum(vector<int>& a, int target) {
    
    
        vector<int> cur;
        sort(a.begin(), a.end());
        dfs(a, cur, target, 0);
        return ans;
    }

    void dfs(vector<int>& a, vector<int>& cur, int target, int begin){
    
    
        if(target == 0){
    
    
            ans.push_back(cur);
            return;
        }
        for(int i = begin; i < a.size(); i++){
    
    
            if(target - a[i] < 0) return;
            cur.push_back(a[i]);
            dfs(a, cur, target - a[i], i);
            cur.pop_back();
        }
    }
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_52855744/article/details/123446567
今日推荐