40. 组合总和 II

✅做题思路or感想

这题主思路是回溯

要注意的是会有元素的重复,所以这里要做树层去重

以下去重是需要在排序后才能进行!!!!

candidates[i]candidates[i - 1]相同的情况下:

  • 如果used[i - 1] == true,则说明同一树枝使用过candidates[i - 1]
  • 如果used[i - 1] == false,则说明同一树层使用过candidates[i - 1]

如果在同一树层使用过了,则直接continue就好了

class Solution {
public:
    vector<vector<int>>result;
    vector<int>temp;
    void dfs(vector<int>& candidates, int target, int startIndex, vector<bool>& used) {
        if (target < 0)return;	//容易想到的剪枝
        //若满足,则加入result中
        if (target == 0) {	
            result.push_back(temp);
            return ;
        }
        //这里有一个不容易想到的剪枝:target - candidates[i] >= 0,若不满足这个条件,则直接结束递归。这个递归的使用前提是要用sort排序过遍历的数组
        for (int i = startIndex; i < candidates.size() && target - candidates[i] >= 0; i++) {
            //树层去重
            if (i > 0 && candidates[i - 1] == candidates[i] && used[i - 1] == false)continue;
            temp.push_back(candidates[i]);
            used[i] = true;
            dfs(candidates, target - candidates[i], i + 1, used);
            //回溯
            used[i] = false;
            temp.pop_back();
        }
    }
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        //注意排序!只有sort排序后,used数组的树层去重和for中的剪枝才能实现!!!!
        sort(candidates.begin(), candidates.end());
        vector<bool>used(candidates.size() + 1, false);
        dfs(candidates, target, 0, used);
        return result;
    }
};
posted @   北原春希  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示