216 Combination Sum III [Leetcode]
来源:互联网 发布:淘宝网韩版女童装 编辑:程序博客网 时间:2024/04/28 15:27
题目内容:
Find all possible combinations of k numbers that add up to a number n, given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers.
Ensure that numbers within the set are sorted in ascending order.
Example 1:
Input: k = 3, n = 7
Output:
[[1,2,4]]
Example 2:
Input: k = 3, n = 9
Output:
[[1,2,6], [1,3,5], [2,3,4]]
解题思路:
保存一个目标对象数组,这里是1-9,然后使用回溯的方法求所有可能相加的结果。
代码实现如下:
class Solution {private: vector<vector<int>> result; vector<int> nums;public: vector<vector<int>> combinationSum3(int k, int n) { vector<int> mid_rlt; nums = vector<int>(9); for(int i = 1; i < 10; ++i) nums[i-1] = i; backtracking(mid_rlt, n, 0, k); return result; } void backtracking(vector<int> mid_rlt, int remain, int index, int count) { if(remain == 0 && count == 0) { result.push_back(mid_rlt); return; } for(int i = index; nums[i] <= remain && i < 9; ++i) { mid_rlt.push_back(nums[i]); backtracking(mid_rlt, remain - nums[i], i+1, count-1); mid_rlt.pop_back(); } }};
在上述基础上我们还可以进行剪枝。给定一个数字以及要求组成他的数字的个数,我们能够判断这些数字的个数能够组成的最大值和最小值。因此在回溯之前加上这样一个判断可以大大提高效率。
代码如下:
class Solution {private: vector<vector<int>> result; vector<int> nums;public: vector<vector<int>> combinationSum3(int k, int n) { vector<int> mid_rlt; nums = vector<int>(9); for(int i = 1; i < 10; ++i) nums[i-1] = i; backtracking(mid_rlt, n, 0, k); return result; } void backtracking(vector<int> mid_rlt, int remain, int index, int count) { if(getMin(count) > remain || getMax(count) < remain) return; if(count == 0) { if(remain == 0) result.push_back(mid_rlt); return; } for(int i = index; nums[i] <= remain && i < 9; ++i) { mid_rlt.push_back(nums[i]); backtracking(mid_rlt, remain - nums[i], i+1, count-1); mid_rlt.pop_back(); } } int getMin(int k) { int minValue(0); for(int i = 0; i < k; ++i) minValue += nums[i]; return minValue; } int getMax(int k) { int maxValue(0); for(int i = 0; i < k; ++i) maxValue += nums[8-i]; return maxValue; }};
0 0
- leetcode 216: Combination Sum III
- 【Leetcode】Combination Sum III #216
- Leetcode 216 Combination Sum III
- LeetCode(216)Combination Sum III
- leetcode 216: Combination Sum III
- [leetcode] 216 Combination Sum III
- [LeetCode 216] Combination Sum III
- 216 Combination Sum III [Leetcode]
- Leetcode #216 Combination Sum III
- LeetCode 216 Combination Sum III
- 【leetcode】【216】Combination Sum III
- 【LeetCode-216】Combination Sum III
- LeetCode 216 Combination Sum III
- LeetCode-216:Combination Sum III
- LeetCode #216: Combination Sum III
- LeetCode[216] Combination Sum III
- LeetCode 216 Combination Sum III
- LeetCode.216 Combination Sum III
- iOS 代理传值
- C++ 复制构造函数和赋值操作符
- 博主声明!!!
- MySQL 转换函数与运算符
- 位运算符
- 216 Combination Sum III [Leetcode]
- [经济学原理|微观部分]绪论
- uva 1262 排列
- html学习笔记
- OC中的协议
- C++中,get和getline函数的区别
- Hive中操作数据库表时as一般用法说明
- [经济学原理|微观部分]供求理论
- Android 获取照片的方法(1)