代码随想录算法训练营第二十九天 | 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;
    }
};
相关推荐
范纹杉想快点毕业6 小时前
嵌入式C语言实战开发详解
linux·运维·算法
闲看云起7 小时前
LeetCode day3-最长连续序列
算法·leetcode
TechNomad7 小时前
二叉堆&大根堆&小根堆的介绍和使用
数据结构
随意起个昵称7 小时前
【题解学习】序列题
学习·算法
思通数科多模态大模型7 小时前
门店 AI 清洁系统:AI 语义分割 + 机器人清洁
大数据·人工智能·算法·目标检测·计算机视觉·自然语言处理·机器人
六毛的毛7 小时前
比较含退格的字符串
开发语言·python·leetcode
iAkuya7 小时前
(leetcode)力扣100 27合并两个有序链表(迭代/递归)
算法·leetcode·链表
Brduino脑机接口技术答疑7 小时前
TDCA 算法在 SSVEP 场景中的 Padding 技术:原理、应用与工程实现
人工智能·算法·机器学习·数据分析·脑机接口
挖矿大亨7 小时前
C++中深拷贝与浅拷贝的原理
开发语言·c++·算法
发疯幼稚鬼7 小时前
图的存储与拓扑排序
数据结构·算法·排序算法·拓扑学