代码随想录算法训练营第二十九天 | 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;
    }
};
相关推荐
小程故事多_805 小时前
从A2C、TRPO、PPO到GRPO,强化学习策略梯度算法完整演进与大模型落地实战解析
人工智能·算法
2601_956121977 小时前
二分算法(知识点+题目)
c++·算法
蒙奇·D·路飞-9 小时前
OpenClaw:开源的《合金弹头》精神续作与终极本地部署指南
c++·开源·mfc
AndrewHZ10 小时前
【LLM技术全景】阶段总结:技术原理篇核心知识回顾
人工智能·深度学习·算法·语言模型·大模型·llm·芯片开发
小星星闪亮登场11 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
梓䈑11 小时前
【用 Vibe Coding 实现的 C++17 在线判题系统】前端开发 + Web 自动化测试
前端·c++·ai编程
冻柠檬飞冰走茶11 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
玖玥拾11 小时前
LeetCode 88 合并两个有序数组
算法·leetcode
TunerT_TQ12 小时前
Valhalla 静态工程审阅 #018|MMCV 源码证据驱动评测【大厂开源基础设施特辑】
c++·开源·mfc·#计算机视觉·#商汤科技·#openmmlab·#静态源码审计
数据皮皮侠AI12 小时前
上市公司数字供应链金融指数(2010-2024)
大数据·人工智能·算法