组合总和 II——力扣40

文章目录

      • 题目描述
      • 法一 回溯

题目描述

组合总和 II——力扣40_第1张图片
组合总和 II——力扣40_第2张图片

法一 回溯

组合总和 II——力扣40_第3张图片
组合总和 II——力扣40_第4张图片
组合总和 II——力扣40_第5张图片

class Solution{
public:
	vector<pair<int, int>>freq;
	vector<vector<int>> res;
	vector<int> seq;
	
	void dfs(int pos, int rest){
		//如果目标值为0,说明可能有一个组合或者rest本身为0  压入二维数组 
		if(rest==0){
			res.push_back(seq);
			return;
		}
		//如果到末尾了,或者第一个数值就比目标值大,直接返回
		if(pos==freq.size() || rest<freq[pos].first){
			return;
		}
		dfs(pos+1, rest);
		
		int most = min(rest / freq[pos].first, freq[pos].second);
		for(int i=1;i<=most;i++){     //注意这从1开始  因为后边有乘法 
			seq.push_back(freq[pos].first);
			//试探每一值开始有没有可能构成target
			dfs(pos+1, rest-i*freq[pos].first);
		}
		for(int i=0;i<most;i++){
			seq.pop_back();   //清空seq 
		}
	}
	
	vector<vector<int>> combinationSum2(vector<int>& candidates, int target){
		sort(candidates.begin(), candidates.end());
		for(auto num:candidates){
			if(freq.empty() || num!=freq.back().first){
				freq.emplace_back(num, 1); //其中1用来指定 num 对应的值的初始数量 
			} else {
				freq.back().second++;
			}
		}
		dfs(0, target);
		return res;
	}
};

组合总和 II——力扣40_第6张图片

你可能感兴趣的:(算法刷题笔记,leetcode,算法,职场和发展,数据结构)