代码随想录算法训练营第二十九天 | 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;
    }
};
相关推荐
chenyuhao20248 分钟前
MySQL索引特性
开发语言·数据库·c++·后端·mysql
没书读了28 分钟前
数据结构-考前记忆清单
数据结构
灰灰勇闯IT35 分钟前
KMP算法在鸿蒙系统中的应用:从字符串匹配到高效系统级开发(附实战代码)
算法·华为·harmonyos
小龙报36 分钟前
【算法通关指南:数据结构和算法篇 】队列相关算法题:3.海港
数据结构·c++·算法·贪心算法·创业创新·学习方法·visual studio
csuzhucong39 分钟前
一阶魔方、一阶金字塔魔方、一阶五魔方
算法
五花就是菜1 小时前
P12906 [NERC 2020] Guide 题解
算法·深度优先·图论
辞旧 lekkk1 小时前
【c++】封装红黑树实现mymap和myset
c++·学习·算法·萌新
星轨初途1 小时前
C++的输入输出(上)(算法竞赛类)
开发语言·c++·经验分享·笔记·算法
n***F8751 小时前
SpringMVC 请求参数接收
前端·javascript·算法
Liangwei Lin1 小时前
洛谷 P1025 [NOIP 2001 提高组] 数的划分
算法