1. 程式人生 > 其它 >力扣-216-組合總和Ⅲ

力扣-216-組合總和Ⅲ

仍舊是有一個目標和,但是另一個條件變了

  • 從給定的陣列元素中選擇變成了從1-9中固定選擇
  • 不限結果陣列元素個數變成了限制k個數字

(看起來有點像組合的加強版)
從1-9中選擇k個數字組合,使得他們的和=n

嗯…那我不是對組合的結果篩一篩既可以了?!

class Solution {
public:
	vector<vector<int>> res;
	vector<int> temp;
	vector<vector<int>> combinationSum3(int k, int n) {
		backTrack(k, n, 1);
		return res;
	}

	void backTrack(int k,int n,int cur) {
		if (temp.size() == k && accumulate(temp.begin(), temp.end(), 0) == n) {
			res.push_back(temp);
			return;
		}
		for (int i = cur; i <= 9; i++) {
			temp.push_back(i);
			backTrack(k, n, i + 1);
			temp.pop_back();
		}
	}
};

當然直接調函式是最快的,也是思路最清晰的,但是不是效率最高的,因為它計算了所有的組合
所以我們嘗試優化一下,其實就是之前的老辦法

class Solution {
public:
	vector<vector<int>> res;
	vector<int> temp;
	vector<vector<int>> combinationSum3(int k, int n) {
		backTrack(k, n, 1);
		return res;
	}

	void backTrack(int k,int target,int cur) {
		if (target < 0) return;
		if (temp.size() == k && target==0) {
			res.push_back(temp);
			return;
		}
		for (int i = cur; i <= 9; i++) {
			temp.push_back(i);
			backTrack(k, target-i, i + 1);
			temp.pop_back();
		}
	}
};