• LeetCode(40):组合总和 II


    Medium!

    题目描述:

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

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

    说明:

    • 所有数字(包括目标数)都是正整数。
    • 解集不能包含重复的组合。 

    示例 1:

    输入: candidates = [10,1,2,7,6,1,5], target = 8,
    所求解集为:
    [
      [1, 7],
      [1, 2, 5],
      [2, 6],
      [1, 1, 6]
    ]
    

    示例 2:

    输入: candidates = [2,5,2,1,2], target = 5,
    所求解集为:
    [
      [1,2,2],
      [5]
    ]

    解题思路:

    这道题跟之前那道 Combination Sum 组合之和 本质没有区别,只需要改动一点点即可,之前那道题给定数组中的数字可以重复使用,而这道题不能重复使用,只需要在之前的基础上修改两个地方即可,首先在递归的for循环里加上if (i > start && num[i] == num[i - 1]) continue; 这样可以防止res中出现重复项然后将递归调用combinationSum2DFS里面的参数换成i+1,这样就不会重复使用数组中的数字了。

    C++解法一:

     1 class Solution {
     2 public:
     3     vector<vector<int> > combinationSum2(vector<int> &num, int target) {
     4         vector<vector<int> > res;
     5         vector<int> out;
     6         sort(num.begin(), num.end());
     7         combinationSum2DFS(num, target, 0, out, res);
     8         return res;
     9     }
    10     void combinationSum2DFS(vector<int> &num, int target, int start, vector<int> &out, vector<vector<int> > &res) {
    11         if (target < 0) return;
    12         else if (target == 0) res.push_back(out);
    13         else {
    14             for (int i = start; i < num.size(); ++i) {
    15                 if (i > start && num[i] == num[i - 1]) continue;
    16                 out.push_back(num[i]);
    17                 combinationSum2DFS(num, target - num[i], i + 1, out, res);
    18                 out.pop_back();
    19             }
    20         }
    21     }
    22 };
  • 相关阅读:
    【转】C语言实现C++面向对象的封装、继承、多态机制
    【读书笔记】线程栈属性
    实际用户ID,有效用户ID,设置用户ID
    与进程相关的文件结构
    关于printf()与fflush()
    文件描述符与FILE结构体
    【转】pthread_cleanup_push()/pthread_cleanup_pop()的详解
    SQL Server 2008数据库复制实现数据库同步备份(转载)
    Entity Framework快速入门
    C#实现组合键
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/9138654.html
Copyright © 2020-2023  润新知