代码随想录算法训练营第二十九天 | 491.递增子序列,46.全排列 ,47.全排列 II

这道题主要是在剪枝条件里去做处理,把可能重复的组合给去掉,同时不符合递增条件的组合也去掉

但是,问题是去重操作是不允许改变元素在序列的次序的,这也就意味着采用组合II这道题先排序,把相同元素聚拢再跳过的策略是不适用的。只能采用类似集合set的办法来判断是否有同类元素出现过。(当然,我认为如果把初始的元素值和初始位置数据存到pair里,也是一个好办法,后序做法就和组合II没什么两样)

cpp 复制代码
class Solution {
public:
    vector<vector<int>> res;
    vector<int> resVec;
    vector<bool> visit;

    void resInit(vector<int>& nums) {}
    bool isValid(vector<int> resVec, vector<int>& nums, unordered_set<int> chooseSet,int index) {

        if (resVec.size() > 0) {
            int curMax = resVec[resVec.size() - 1];
            if (curMax > nums[index]) {
                return false;
            }
        }

        if(chooseSet.count(nums[index]) > 0) {
            return false;
        }

        return true;
    }

    void traceback(vector<int> resVec, vector<int>& nums, int start) {
        unordered_set<int> chooseSet;
        for (int i = start; i < nums.size(); i++) {
            if (!isValid(resVec, nums, chooseSet,i)) {
                continue;
            }
            chooseSet.insert(nums[i]);
            resVec.push_back(nums[i]);
            traceback(resVec, nums, i + 1);
            resVec.pop_back();
        }
        if (resVec.size() >= 2) {
            res.push_back(resVec);
        }
        return;
    }

    vector<vector<int>> findSubsequences(vector<int>& nums) {
        resInit(nums);
        traceback(resVec, nums, 0);

        return res;
    }
};


全排列,无重元素不可复取

cpp 复制代码
class Solution {
public:
    vector<vector<int>> res;
    vector<int> resVec;
    vector<bool> visit;
    void resInit(vector<int>& nums){
        vector<bool> visitTem(nums.size(),false);
        visit = visitTem;
    }
    bool isValid(vector<bool> &visit,int i){
        if(visit[i]){
           return false;
        }
        return true;
    }
    void tracebcak(vector<int> resVec,vector<int>& nums,vector<bool> visit){
         if(resVec.size() == nums.size()){
             res.push_back(resVec);
             return;
         }
         for(int i = 0;i< nums.size();i++){
            if(!isValid(visit,i)){
               continue;
            }
            visit[i] = true;
            resVec.push_back(nums[i]);
            tracebcak(resVec,nums,visit);
            visit[i] = false;
            resVec.pop_back();
         }
    }
    vector<vector<int>> permute(vector<int>& nums) {
            resInit(nums);
            tracebcak(resVec,nums,visit);
            return res;
    }
};


有重排列不可复取

cpp 复制代码
class Solution {
public:
    vector<vector<int>> res;
    vector<int> resVec;
    vector<bool> visit;
    void resInit(vector<int>& nums){
        sort(nums.begin(),nums.end());
        vector<bool> visitTem(nums.size(),false);
        visit = visitTem;
    }

    bool isValid(vector<int>& nums,vector<bool> &visit,int i){
           if(visit[i]){
             return false;
           }
           if(i - 1 >=0 && !visit[i-1] && nums[i-1] == nums[i] ){
              return false;
           }
           return true;
    }

    void traceback(vector<int> resVec,vector<int>& nums,vector<bool> visit){
         if(resVec.size() == nums.size()){
            res.push_back(resVec);
            return;    
         }
         for(int i = 0;i< nums.size();i++){
            if(!isValid(nums,visit,i)){
               continue;
            }
            visit[i] = true;
            resVec.push_back(nums[i]);
            traceback(resVec,nums,visit);
            visit[i] = false;
            resVec.pop_back();
         }
    }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
       resInit(nums);
       traceback(resVec,nums,visit);
       return res;
    }
};
相关推荐
郝学胜-神的一滴10 分钟前
C++20 高级编程 004:从初始化、内存到const系列关键字
开发语言·算法·编程·软件构建·c++20
kyle~16 分钟前
点云配准--- 迭代最近点 ICP 求解
线性代数·算法·机器学习
zmzb010317 分钟前
C++课后习题训练记录Day199
开发语言·c++
LuminousCPP24 分钟前
数据结构-二叉树(三):堆复杂度证明与 Top-K 问题|错位相减推导 + 海量数据内存优化
c语言·数据结构·笔记·排序算法
qq74223498426 分钟前
Gradio 极简入门:三分钟为AI模型打造交互界面,并对比Streamlit与Dash如何选型
人工智能·算法·大模型·交互·dash
人邮异步社区31 分钟前
如何系统地学习 C++ 语言?
开发语言·c++·学习
欧特克_Glodon40 分钟前
OpenCV计算机视觉开发入门与实践<二十>:非线性变换灰度变换
c++·人工智能·opencv·计算机视觉
1000世界小札6 小时前
《大话数据结构》第9章精读:归并排序与快速排序完整 C++ 实现
数据结构·c++·算法
2601_956121979 小时前
背包基础篇(01、完全、分组、多重、混合)
c++·算法·动态规划
fpcc9 小时前
跟我学C++中级篇——编译期的条件选择
开发语言·c++