代码随想录算法训练营第二十九天 | 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;
    }
};
相关推荐
YuTaoShao28 分钟前
【LeetCode 热题 100】141. 环形链表——快慢指针
java·算法·leetcode·链表
hjjdebug1 小时前
ffplay6 播放器关键技术点分析 1/2
c++·ffmpeg·音视频
小小小新人121231 小时前
C语言 ATM (4)
c语言·开发语言·算法
Azxcc02 小时前
C++异步编程入门
开发语言·c++
吐泡泡_2 小时前
C++(STL源码刨析/vector)
c++
你的冰西瓜2 小时前
C++排序算法全解析(加强版)
c++·算法·排序算法
এ᭄画画的北北2 小时前
力扣-31.下一个排列
算法·leetcode
特立独行的猫a2 小时前
11款常用C++在线编译与运行平台推荐与对比
java·开发语言·c++
笑鸿的学习笔记2 小时前
qt-C++笔记之setCentralWidget的使用
c++·笔记·qt