代码随想录算法训练营 | 回溯算法part04

491.递增子序列

491.递增子序列

cpp 复制代码
class Solution {
private:
    vector<vector<int>> res;
    vector<int> temp;
    void backtracing (vector<int>& nums, int startIndex) {
        if (temp.size() >= 2) {
            res.push_back(temp);
            //return;
        }
        unordered_set<int> uset; // 使用set来对本层元素进行去重
        for (int i = startIndex; i < nums.size(); ++i) {
            if ((!temp.empty() && nums[i] < temp.back()) || uset.find(nums[i]) != uset.end()) {
                continue;
            }
            uset.insert(nums[i]); // 记录这个元素在本层用过了,本层后面不能再用了
            temp.push_back(nums[i]);
            backtracing(nums, i + 1);
            temp.pop_back();
        }
    }
public:
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        backtracing(nums, 0);
        return res;
    }
};

46.全排列

46.全排列

cpp 复制代码
class Solution {
private:
    vector<vector<int>> res;
    vector<int> temp;
    void backtracing (vector<int>& nums) {
        if (temp.size() == nums.size()) {
            res.push_back(temp);
            return;
        }
        for (int i = 0; i < nums.size(); ++i) {
            if (find(temp.begin(), temp.end(), nums[i]) != temp.end()) { // nums 不含重复元素,可以直接判断元素是否被使用
                continue;
            }
            temp.push_back(nums[i]);
            backtracing(nums);
            temp.pop_back();
        }
    }
public:
    vector<vector<int>> permute(vector<int>& nums) {
        backtracing(nums);
        return res;
    }
};

使用used数组存储元素的使用状态

cpp 复制代码
class Solution {
public:
    vector<vector<int>> res;
    vector<int> temp;
    void backtracking(vector<int>& nums, vector<bool>& used){
        if(temp.size() == nums.size()){
            res.push_back(temp);
            return;
        }
        //nums中不含重复元素
        for(int i = 0; i < nums.size(); ++i){
            if (used[i] == true) continue; // temp里已经收录的元素,直接跳过
            used[i] = true;
            temp.push_back(nums[i]);
            backtracking(nums,used);
            temp.pop_back();
            used[i] = false;
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        //使用used数组来记录nums中的每一位是否被使用
        vector<bool> used(nums.size(), false);
        backtracking(nums,used);
        return res;
    }
};

47.全排列 II

47.全排列 II

cpp 复制代码
class Solution {
private:
    vector<vector<int>> res;
    vector<int> temp;
    void backtracing(vector<int>& nums, vector<bool>& used) {
        if (temp.size() == nums.size()) {
            res.push_back(temp);
            return;
        }
        for (int i = 0; i < nums.size(); ++i) {
            if((used[i] == true) || (i > 0 && used[i - 1] == false && nums[i] == nums[i - 1])) {
            	// 同一树杈的同一元素 已被使用过
            	// 同一树层 存在元素相等的情况
                continue;
            }
            used[i] = true;
            temp.push_back(nums[i]);
            backtracing(nums, used);
            temp.pop_back();
            used[i] = false;
        }
    }
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        vector<bool> used(nums.size(), false);
        backtracing(nums, used);
        return res;
    }
};
相关推荐
少司府4 小时前
C++进阶:二叉搜索树
开发语言·数据结构·c++·二叉树·stl·二叉搜索树·tree
8Qi84 小时前
LeetCode 124. 二叉树中的最大路径和(Hard)
算法·leetcode·二叉树·递归
Huangjin007_4 小时前
【C++ STL篇(十四)】哈希表实现:开放定址法与链地址法
c++·哈希算法·散列表
And_Ii4 小时前
LeetCode 1. 两数之和 python
数据结构·算法·leetcode
承渊政道4 小时前
【MySQL数据库学习】MySQL表的约束(上)
数据库·c++·学习·mysql·bash·数据库架构·数据库系统
minji...4 小时前
Linux高级IO(六)基于ET模式、单reactor反应堆的epoll版本的TCP计算服务器
linux·服务器·网络·c++·epoll·socket套接字·reactor反应堆模式
程序大视界4 小时前
【C++ 从基础到项目实战】C++(九):友元与设计模式初探——打破封装的艺术
开发语言·c++·cpp
cpp_25014 小时前
P10377 [GESP202403 六级] 好斗的牛
数据结构·c++·算法·题解·洛谷·gesp六级
邪修king4 小时前
C++ 红黑树自平衡核心:旋转变色、规则详解与 STL 选型逻辑
数据结构·c++·b树·算法
Navigator_Z12 小时前
LeetCode //C - 1089. Duplicate Zeros
c语言·算法·leetcode