Acy夕拾算法 Week2_day3

LeetCode 46. 全排列

/*
整理思路:
无重复元素;排列,元素有顺序
代码随想录
元素不能重复使用,used记录:使用过的-true
树形结构;数组的大小为树的深度
for循环根据used横向遍历;递归根据 结果与数组的大小相等 结束纵向遍历
结果在叶子节点上
*/

//代码随想录
class Solution {
public:
    vector<int> path;
    vector<vector<int>> res;

    void backtracking(vector<int>& nums, vector<bool>& used)
    {
        if(path.size() == nums.size())
        {
            res.push_back(path);
            return;
        }

        for(int i = 0; i < nums.size(); i++)
        {
            if(used[i] == true) continue;
            path.push_back(nums[i]);
            used[i] = true;
            backtracking(nums, used);
            path.pop_back();//回溯
            used[i] = false;
        }
    }

    vector<vector<int>> permute(vector<int>& nums) {
        vector<bool> used(nums.size(), false);
        backtracking(nums, used);
        return res;
    }
};

LeetCode 78. 子集

/*
整理思路:
集合,无重复,顺序改变不增加子集个数
树形结构
startIndex控制从数组的哪里开始取数
结果在每个节点里,每层递归都收集结果
*/

class Solution {
public:
    vector<int> path;
    vector<vector<int>> res;

    void backtracking(vector<int>& nums, int startIndex)
    {
        res.push_back(path);

        for(int i = startIndex; i < nums.size(); i++)
        {
            path.push_back(nums[i]);
            backtracking(nums, i+1);//取数位置后移
            path.pop_back();
        }
    }

    vector<vector<int>> subsets(vector<int>& nums) {
        backtracking(nums, 0);
        return res;
    }
};

LeetCode 39. 组合总和

/*
整理思路:
可重复加,选完仍可再选
代码随想录:回溯三部曲
1.确定函数参数和返回值:sum保存path中元素的和;startIndex数组取数开始位置
2.确定递归终止条件:如果sum>target不继续return;等于push
3.单层搜索逻辑:更新元素至数组中;sum+=;元素可重复使用,递归时用i即可;如何收集如何吐
*/

class Solution {
public:
    vector<int> path;
    vector<vector<int>> res;

    void backtracking(vector<int>& nums, int target, int sum, int startIndex)
    {
        if(sum > target)    return;
        if(sum == target)
        {
            res.push_back(path);
            return;
        }

        for(int i = startIndex; i < nums.size(); i++)
        {
            sum += nums[i];
            path.push_back(nums[i]);
            backtracking(nums, target, sum, i);
            sum -= nums[i];
            path.pop_back();
        }
    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        backtracking(candidates, target, 0, 0);
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值