《慕课网玩转算法面试》笔记及习题解答8.4~8.5
来源:互联网 发布:live2d有mac版本的吗 编辑:程序博客网 时间:2024/06/04 23:41
LeetCode 77. Combinations
Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.
For example,
If n = 4 and k = 2, a solution is
[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4],]思路:通过回溯法求解即可,注意为了避免重复,我们每次递归时应该对于当前元素后面的元素进行递归,不能把前面的元素也算在内
class Solution {public: void findCombine(int index, vector<int>& c, const int& n, const int& k, vector<vector<int>>& res){ if(c.size() == k) { res.push_back(c); return; } for(int i = index; i <= n; i++){ c.push_back(i); findCombine(i+1, c, n,k, res);//注意此处应该是i+1,避免小于i的元素再计算得到重复 c.pop_back(); } return; } vector<vector<int>> combine(int n, int k) { vector<vector<int>> res; if(n < k || n < 1 || k < 1) return res; vector<int> c; findCombine(1, c, n, k, res); return res; }};39. Combination Sum
Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
- All numbers (including target) will be positive integers.
- The solution set must not contain duplicate combinations.
For example, given candidate set [2, 3, 6, 7]
and target 7
,
A solution set is:
[ [7], [2, 2, 3]]
class Solution { private: void findCombinationSum( const vector<int>& candidates, const int index, vector<int>& c, const int& target, vector<vector<int>>& res ){ if(target == 0){ res.push_back(c); } for(int i = index; i <candidates.size(); i++){ if(candidates[i] <= target) { c.push_back(candidates[i]); //注意,为了避免重复元素,我们应该从第i个元素开始寻找 findCombinationSum(candidates, i, c, target-candidates[i], res); //递归结束后进行回溯 c.pop_back(); } } return; } public: vector<vector<int>> combinationSum(vector<int>& candidates, int target) { vector<vector<int>> res; vector<int> c; findCombinationSum(candidates, 0, c, target, res); return res; }};
40. Combination Sum II
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C may only be used once in the combination.
Note:
- All numbers (including target) will be positive integers.
- The solution set must not contain duplicate combinations.
For example, given candidate set [10, 1, 2, 7, 6, 1, 5]
and target 8
,
A solution set is:
[ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6]]
思路:这道题的主要难点在于去除重复元素,可以在递归完一个元素后,直接移动到与当前元素不同的位置
class Solution {private: void findCombinationSum( const vector<int>& candidates, const int index, vector<int>& c, const int& target, vector<vector<int>>& res ){ if(target == 0){ res.push_back(c); } for(int i = index; i <candidates.size(); i++){ if(candidates[i] <= target) { c.push_back(candidates[i]); //注意,为了避免重复元素,我们应该从第i+1个元素开始寻找 findCombinationSum(candidates, i+1, c, target-candidates[i], res); //递归结束后进行回溯,此时i已经递归完毕,如果i+1的元素和i相同,那么直接i++ c.pop_back(); while(i+1 < candidates.size() && candidates[i+1] == candidates[i] ) i++; } } return; } public: vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { vector<vector<int>> res; vector<int> c; sort(candidates.begin(), candidates.end()); findCombinationSum(candidates, 0, c, target, res); return res; }};
216
思路:就是回溯,这题相对简单,注意剪枝
class Solution {private: void findCombination(vector<vector<int>>& res, int index, vector<int>& c,int k, int n){ if(k == 0 && n == 0){ res.push_back(c); return; } for(int i = index; i < 10; i++){ //首先要保证当前的i在后面全部取9的情况下要满足条件 if(n <= i + (k-1) * 9) { c.push_back(i); findCombination(res, i+1, c, k-1, n-i); c.pop_back(); } } return; } public: vector<vector<int>> combinationSum3(int k, int n) { vector<vector<int>> res; vector<int> c; findCombination(res,1, c, k, n); return res; }};
78
Given a set of distinct integers, nums, return all possible subsets.Note: The solution set must not contain duplicate subsets.For example,If nums = [1,2,3], a solution is:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []]
思路:本质上就是一个求组合问题,注意每次递归是从i+1开始避免重复就行了
class Solution {private: void findSub(const vector<int>& nums, int index, vector<int> sub, vector<vector<int>>& res ) { res.push_back(sub); for(int i = index; i < nums.size(); i++) { sub.push_back(nums[i]); findSub(nums, i+1, sub, res);//为了避免重复,每次应该递归应该从i+1开始 sub.pop_back(); } return; }public: vector<vector<int>> subsets(vector<int>& nums) { vector<int> sub; vector<vector<int>> res; findSub(nums, 0, sub, res); return res; }};
90
Given a collection of integers that might contain duplicates, nums, return all possible subsets.
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,2]
, a solution is:
[ [2], [1], [1,2,2], [2,2], [1,2], []]
思路:与40题类似,主要就是排序
class Solution {private: void findSub(const vector<int>& nums, int index, vector<int> sub, vector<vector<int>>& res ) { res.push_back(sub); for(int i = index; i < nums.size(); i++) { sub.push_back(nums[i]); findSub(nums, i+1, sub, res);//为了避免重复,每次应该递归应该从i+1开始 sub.pop_back(); while(i+1 < nums.size() && nums[i] == nums[i+1]) i++; } return; }public: vector<vector<int>> subsetsWithDup(vector<int>& nums) { vector<int> sub; vector<vector<int>> res; sort(nums.begin(), nums.end()); findSub(nums, 0, sub, res); return res; }};
- 《慕课网玩转算法面试》笔记及习题解答8.4~8.5
- 《慕课网玩转算法面试》笔记及习题解答1
- 《慕课网玩转算法面试》笔记及习题解答2
- 《慕课网玩转算法面试》笔记及习题解答3.5~3.6
- 《慕课网玩转算法面试》笔记及习题解答3.1 ~3.4
- 《慕课网玩转算法面试》笔记及习题解答3.7 ~3.8
- 《慕课网玩转算法面试》笔记及习题解答4
- 《慕课网玩转算法面试》笔记及习题解答5.1.~5.3
- 《慕课网玩转算法面试》笔记及习题解答5.4.~5.6
- 《慕课网玩转算法面试》笔记及习题解答6.4.~6.6
- 《慕课网玩转算法面试》笔记及习题解答6.7
- 《慕课网玩转算法面试》笔记及习题解答7.1~7.3
- 《慕课网玩转算法面试》笔记及习题解答7.4~7.6
- 《慕课网玩转算法面试》笔记及习题解答8.1~8.3
- 《慕课网玩转算法面试》笔记及习题解答9.3
- 《慕课网玩转算法面试》笔记及习题解答9.4
- 《慕课网玩转算法面试》笔记及习题解答9.8
- Android面试习题及个人解答
- 仿斗鱼、美团、网易邮箱等 弹窗效果
- SuperMap iClient 9D for MapboxGL地图风格浅析
- MySQL 四种事务隔离级的说明
- 关于python的基础知识9--文件写入列表
- MyBatis缓存策略之二级缓存
- 《慕课网玩转算法面试》笔记及习题解答8.4~8.5
- vue2.0对API的一些理解
- SpringMVC学习小结
- Python 爬虫模拟登陆
- 手机移动端web前端常见问题整理
- 介绍缓存的基本概念和常用的缓存技术
- Python中range()函数的用法
- 【转】城市防洪、排涝及排水设计标准的区别
- LCD驱动---LVDS及调试中的问题(一)