《慕课网玩转算法面试》笔记及习题解答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;    }};


阅读全文
0 0
原创粉丝点击