代码随想录算法训练营第二十八天| 回溯算法

Posted by Zhuoqun on February 10, 2023

491.递增子序列

这道题自己写了好几种办法,发现都有漏洞。看了Carl的答案才想到可以用哈希表。

Carl用哈希表来验证是否在这颗树的同一层里已用过相同的数。这点我在之前并没有想通。现在想明白了:如果当前层用了某个数,就把这个数加到哈希表,如果list里再有这个数,就不call function了。因为如果再把这个数进行回溯计算,那他的答案(至少这一层)会是和之前 同一层有一样的结果。

class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    void backtracking(vector<int> nums, int start_index){
        if(path.size()>=2){
            res.push_back(path);
            
        }
        if(start_index>=nums.size()){
            return ;
        }
        unordered_set<int> u_num;
        for(int i=start_index; i<nums.size(); i++){
            auto it = u_num.find(nums[i]);
            if(it!=u_num.end()){
                continue;
            }
            u_num.insert(nums[i]);
            path.push_back(nums[i]);
            if(validPath(path)){
                backtracking(nums,i+1);
            }
            
            path.pop_back();
        }
    }
    bool validPath(vector<int> cur_path){
        for(int i=1; i<cur_path.size(); i++){
            if(cur_path[i]<cur_path[i-1]){
                return false;
            }
        }
        return true;
    }
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        backtracking(nums,0);
        return res;
    }
};

46.全排列

写不出来。怎么写也不对。

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking (vector<int>& nums, vector<bool>& used) {
        // 此时说明找到了一组
        if (path.size() == nums.size()) {
            result.push_back(path);
            return;
        }
        for (int i = 0; i < nums.size(); i++) {
            if (used[i] == true) continue; // path里已经收录的元素,直接跳过
            used[i] = true;
            path.push_back(nums[i]);
            backtracking(nums, used);
            path.pop_back();
            used[i] = false;
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        result.clear();
        path.clear();
        vector<bool> used(nums.size(), false);
        backtracking(nums, used);
        return result;
    }
};

休息了一会,看了一遍,明白是什么意思了。

47.全排列 II

草,不想写了。什么几把玩意。绕绕绕的。妈的。