zoukankan      html  css  js  c++  java
  • 2021-09-12 刷题 40. 组合总和 II

    题目链接:https://leetcode-cn.com/problems/combination-sum-ii/

    题目说明:

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

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

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

    示例 1:

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

    输入: candidates = [2,5,2,1,2], target = 5,
    输出:
    [
    [1,2,2],
    [5]
    ]
    题目思想:

    1、与39题不同的是,此题也是组合求和的问题,但是数组里的元素不能进行重复,那么相较于39题,需要完成的操作就是去重问题

    2、去重问题,需要分清,去重的是每一层还是每一支,进行判断,需要去重的是每一层

    题目代码:

    class Solution {
    private:
        vector<vector<int>> result;
        vector<int> path;
        void backtracking(vector<int>& candidates, int target, int sum, int startIndex, vector<bool>& used) {
            if (sum == target) {
                result.push_back(path);
                return;
            }
            for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) {
                // used[i - 1] == true,说明同一树支candidates[i - 1]使用过
                // used[i - 1] == false,说明同一树层candidates[i - 1]使用过
                // 要对同一树层使用过的元素进行跳过
                if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) {
                    continue;
                }
                sum += candidates[i];
                path.push_back(candidates[i]);
                used[i] = true;
                backtracking(candidates, target, sum, i + 1, used); // 和39.组合总和的区别1,这里是i+1,每个数字在每个组合中只能使用一次
                used[i] = false;
                sum -= candidates[i];
                path.pop_back();
            }
        }
    
    public:
        vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
            vector<bool> used(candidates.size(), false);
            path.clear();
            result.clear();
            // 首先把给candidates排序,让其相同的元素都挨在一起。
            sort(candidates.begin(), candidates.end());
            backtracking(candidates, target, 0, 0, used);
            return result;
        }
    };

    参考链接:https://leetcode-cn.com/problems/combination-sum-ii/solution/dai-ma-sui-xiang-lu-dai-ni-xue-tou-hui-s-ig29/

  • 相关阅读:
    some tips
    ORA00847: MEMORY_TARGET/MEMORY_MAX_TARGET and LOCK_SGA cannot be set together
    Chapter 01Overview of Oracle 9i Database Perfomrmance Tuning
    Chapter 02Diagnostic and Tuning Tools
    变量与常用符号
    Chapter 18Tuning the Operating System
    标准输入输出
    Trace files
    DBADeveloped Tools
    Chapter 03Database Configuration and IO Issues
  • 原文地址:https://www.cnblogs.com/gjianli/p/15260033.html
Copyright © 2011-2022 走看看