首页 > 其他分享 >代码随想录训练营第25天|set去重

代码随想录训练营第25天|set去重

时间:2024-09-09 19:54:34浏览次数:3  
标签:25 set nums 随想录 dfs vector result path size

491. 非递减子序列

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;


    void dfs(vector<int>& nums, int startIdx){
        if(startIdx==nums.size()){
            return;
        }
        unordered_set<int> seen;
        for(int i=startIdx; i<nums.size(); i++){
            if((path.empty()||nums[i]>=path.back())&&!seen.count(nums[i])){
                path.push_back(nums[i]);
                seen.insert(nums[i]);
                if(path.size()>=2)
                    result.push_back(path);
                dfs(nums,i+1);
                path.pop_back();
            }
        }
    }
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        dfs(nums,0);
        return result;
    }
};

nums不能排序,所以无法用while在回溯后去重,只能借助set,记录当前层已经使用过的数值,通过count方法实现去重。

46. 全排列

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    vector<int> used;

    void dfs(vector<int>& nums){
        if(path.size()==nums.size()){
            result.push_back(path);
            return;
        }
        for(int i=0; i<nums.size(); i++){
            if(!used[i]){
                path.push_back(nums[i]);
                used[i]=true;
                dfs(nums);
                used[i]=false;
                path.pop_back();
            }
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        used.assign(nums.size(),false);
        dfs(nums);
        return result;
    }
};

 排列需要考虑顺序,不能用startIdx递增搜索,通过标记数组used,搜索每一层未使用过的元素。

47. 全排列 II

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    vector<int> used;

    void dfs(vector<int>& nums){
        if(path.size()==nums.size()){
            result.push_back(path);
            return;
        }
        for(int i=0; i<nums.size(); i++){
            if(!used[i]){
                path.push_back(nums[i]);
                used[i]=true;
                dfs(nums);
                used[i]=false;
                path.pop_back();
                while(i+1<nums.size()&&nums[i+1]==nums[i])
                    i++;
            }
        }
    }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        used.assign(nums.size(),false);
        sort(nums.begin(),nums.end());
        dfs(nums);
        return result;
    }
};

本题nums可以进行排序,所以回溯后利用while过滤掉相同数值,即可实现去重。

标签:25,set,nums,随想录,dfs,vector,result,path,size
From: https://blog.csdn.net/jiyisuifeng1991/article/details/141988901

相关文章

  • 代码随想录训练营第24天|回溯过程收集
    93.复原IP地址classSolution{public:vector<vector<string>>result;vector<string>path;boolcheck(string&sub){if(sub.length()>1&&sub[0]=='0')returnfalse;try{......
  • 代码随想录训练营第23天|回溯去重
    39.组合总和classSolution{public:vector<vector<int>>result;vector<int>path;intsum=0;voiddfs(vector<int>&candidates,inttarget,intstartIdx){if(sum==target){result.push_back(path......
  • 【Java毕设最新选题推荐2025】基于springboot的酒店管理系统
    摘 要21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。论文主要是对酒店管理系统......
  • 代码随想录day9-栈和队列1
    题目1232.用栈实现队列请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现MyQueue类:voidpush(intx)将元素x推到队列的末尾intpop()从队列的开头移除并返回元素intpeek()返回队列开头的元素booleanempty()如......
  • P5025
    高效高效,坚持高效,耶(•̀ω•́)y首先,我们考虑引爆每个炸弹,它能引爆的区间是多少(即:它能对答案做出什么贡献)易得炸一个=炸这个区间为什么?你只要引爆了一个大炸弹(例如沙皇)它就会把它的左边和右边一起抬走所以考虑线性维护每个炸弹向左/向右能炸到哪里代码十分精华:#inclu......
  • 代码随想录day8-字符串2
    题目1151.反转字符串中的单词*给你一个字符串s,请你反转字符串中单词的顺序。单词是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词分隔开。返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。注意:输入字符串s中可能会存在前导空格、尾......
  • C++: set与map容器的介绍与使用
    本文索引前言1.二叉搜索树1.1概念1.2二叉搜索树操作1.2.1查找与插入1.2.2删除1.2.3二叉搜索树实现代码2.树形结构的关联式容器2.1set的介绍与使用2.1.1set的构造函数2.1.2set的迭代器2.1.3set的容量2.1.4set的修改操作2.2map的介绍与使用2.2.1map的构造......
  • 【题解】Solution Set - NOIP2024集训Day25 概率期望 dp
    【题解】SolutionSet-NOIP2024集训Day25概率期望dphttps://www.becoder.com.cn/contest/5515「QOJ2606」Gachapon\(f_{i,j}\):用一次合法的level-irolling能够抽到的\(j\)的期望个数。\(h_{i,j,k}\):在\(i\)次操作之内,抽到恰好\(k\)个\(j\)的概率。\[h_{i,j,k......
  • 2025超实用的软件EasyRecovery数据恢复工具免费版下载
    ......
  • EasyRecovery2025最新超级好用的电脑数据恢复软件
    亲爱的笔记本小能手们,你们有没有想过,在电脑里辛苦工作了好几个小时的成果,一不小心因为手滑、误操作或是其他原因,突然“噗通”一下不见了?......