zoukankan      html  css  js  c++  java
  • 40. 组合总和 II

    给定一个数组 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]
    ]

    #include<iostream>
    #include<stack>
    #include<algorithm>
    #include<string>
    #include<vector>
    using namespace std;
    /*
    要求返回所有符合要求解的题都是尝试利用到递归,
    1.边界条件
    明确递归终止的条件
    2.递归前进段
    提取重复的逻辑,缩小问题的规模
    3.递归返回段
    给出递归终止时的处理办法
    */
    class Solution {
    public:
    	vector<vector<int>> combinationSum2(vector<int>& candidates, int target)
    	{
    		vector<vector<int>> res;//res 保存所有已经得到的解
    		vector<int> out;//为一个解
    		sort(candidates.begin(), candidates.end());
    		combinationSumDFS(candidates, target, 0, out, res);
    		return res;
    	}
    	//start 记录当前的递归到的下标
    	//执行递归函数将反复调用其自身,每调用一次就进入新的一层。
    	void combinationSumDFS(vector<int>& candidates, int target, int start, vector<int>& out, vector<vector<int>>& res)
    	{
    		if (target < 0)
    		{
    			return;
    		}
    		if (target == 0)
    		{
    			res.push_back(out);
    			return;
    		}
    		for (int i = start; i < candidates.size(); ++i)
    		{
    			//防止 res 中出现重复项
    			if (i > start && candidates[i] == candidates[i - 1])
    			{
    				continue;
    			}
    			out.push_back(candidates[i]);
    			combinationSumDFS(candidates, target - candidates[i], i + 1, out, res);//调用新的递归函数时,此时的 target 要减去当前数组的的数
    			out.pop_back();
    		}
    	}
    };
    int main()
    {
    	int a[1000];
    	int x;
    	int i = 0;
    	vector<int> vec;
    	int target;
    	while (cin >> a[i])
    	{
    		vec.push_back(a[i]);
    		i++;//注意这里i++对输出结果的影响
    		x = cin.get();
    		if (x == '
    ')
    			break;
    
    	}
    	cin >> target;
    	vector<vector<int>> ans = Solution().combinationSum2(vec, target);
    	int n = ans.size();
    	//输出
    	for (int i = 0; i < n; i++)
    	{
    		for (int j = 0; j < ans[i].size(); j++)
    		{
    			cout << ans[i][j] << " ";
    		}
    		cout << endl;
    	}
    	system("pause");
    	return 0;
    }
    

      

  • 相关阅读:
    mysql 备份脚本
    (四)监控cpu
    (三)修改图形乱码问题
    (二)centos7安装zabbix agentd端
    (一)Centos7安装zabbix3.4 server端
    (五)条件测试
    (四)mysql数据类型
    (三)mysql数据库基本操作
    (二)mysql忘记root密码
    (五)cobbler自定义系统安装
  • 原文地址:https://www.cnblogs.com/277223178dudu/p/14877031.html
Copyright © 2011-2022 走看看