Backtracing: Subsets I+II, Permutations I+II

 Subsets

vector<vector<int>> res;
vector<vector<int>> subsets(vector<int>& nums) {
    vector<int> cur;
    backtrack(nums,cur,0);
    return res;
}
void backtrack(vector<int> &nums, vector<int> &cur, int start){
    res.push_back(cur);
    for (int i=start;i<nums.size();++i){
        cur.push_back(nums[i]);
        backtrack(nums,cur,i+1);
        cur.pop_back();
    }
}

Subsets II

有重复元素,先排序。同一层递归中相同元素跳过。

vector<vector<int>> res;
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
    sort(nums.begin(),nums.end());
    vector<int> cur;
    backtrack(nums,cur,0);
    return res;
}
void backtrack(vector<int> &nums, vector<int> &cur, int start){
    res.push_back(cur);
    for (int i=start;i<nums.size();++i){
        if (i>start && nums[i]==nums[i-1]) continue;
        cur.push_back(nums[i]);
        backtrack(nums,cur,i+1);
        cur.pop_back();
    }
}

Subsets 时间复杂度

T(n) = T(n-1)+T(n-2)+...+T(1)+T(0) -> T(n) = O(2^n)

如果考虑 res.push_back(cur) 是时间 O(n),那么总的时间复杂度为 O(n*2^n)

====================================================================

 Permutations

vector<vector<int>> res;
vector<vector<int>> permute(vector<int> &nums) {
    vector<int> cur;
    vector<bool> used(nums.size(),false);
    backtrack(nums,cur,used);
    return res;
}
void backtrack(vector<int> &nums, vector<int> &cur, vector<bool> &used){
    if (cur.size()==nums.size()){ res.push_back(cur); return; }
    for (int i=0;i<nums.size();++i){
        if (used[i]) continue;
        cur.push_back(nums[i]); used[i]=true;
        backtrack(nums,cur,used);
        cur.pop_back(); used[i]=false;
    }
}

也可以加个start用swap来做。

猜你喜欢

转载自www.cnblogs.com/hankunyan/p/9944142.html
今日推荐