首页 > 编程语言 >算法刷题 Day 29 | 491.递增子序列 46.全排列 47.全排列 II

算法刷题 Day 29 | 491.递增子序列 46.全排列 47.全排列 II

时间:2023-02-03 21:13:27浏览次数:48  
标签:排列 nums 46 47 used vector result path size

详细布置

491.递增子序列

本题和大家刚做过的 90.子集II 非常像,但又很不一样,很容易掉坑里。

https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html

视频讲解:https://www.bilibili.com/video/BV1EG4y1h78v

Tips:有以下几点要注意:

1. 递增的元素可以不相邻。

2. 为了去重,要在一层内限制相等的元素被使用多次,因此定义一个unordered_set来记录使用过哪些元素。

我的题解:

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

    void backtracking(vector<int>& nums, int pos){
        if(pos == nums.size()){
            return;
        }

        // 用这个set来记录用过哪些元素
        unordered_set<int> uset;

        for(int i = pos; i<nums.size();i++){
            if( (path.size() == 0 || nums[i] >= path[path.size() - 1]) && uset.find(nums[i])==uset.end()){
                path.push_back(nums[i]);
                uset.insert(nums[i]);
                if(path.size()>=2){
                    result.push_back(path);
                }
                backtracking(nums,i+1);
                path.pop_back();
            }
        }
    }

    vector<vector<int>> findSubsequences(vector<int>& nums) {
        backtracking(nums, 0);
        return result;
    }
};

46.全排列

本题重点感受一下,排列问题 与 组合问题,组合总和,子集问题的区别。 为什么排列问题不用 startIndex

https://programmercarl.com/0046.%E5%85%A8%E6%8E%92%E5%88%97.html

视频讲解:https://www.bilibili.com/video/BV19v4y1S79W

Tips:这道题就是定义一个used数组,来标记在当前树的纵向方向上有哪些元素已被使用过。同时每层都是从0开始搜索而不是startIndex。

如果数组a不能在声明的时候初始化,可以先定义再初始化:

vector<int> a;
a=vector<int>(nums.begin(), nums.end());
 我的题解:
class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    vector<bool> used;

    void backtracking(vector<int>& nums){
        if(path.size() == nums.size()){
            result.push_back(path);
            return;
        }

        for(int i = 0; i< nums.size(); i++){
            if(used[i]){
                continue;
            }
            used[i] = true;
            path.push_back(nums[i]);
            backtracking(nums);
            path.pop_back();
            used[i] = false;
        }
    }

    vector<vector<int>> permute(vector<int>& nums) {
        used = vector<bool>(nums.size(),false);
        backtracking(nums);
        return result;
    }
};

47.全排列 II

本题 就是我们讲过的 40.组合总和II 去重逻辑 和 46.全排列 的结合,可以先自己做一下,然后重点看一下 文章中 我讲的拓展内容。 used[i - 1] == true 也行,used[i - 1] == false 也行

https://programmercarl.com/0047.%E5%85%A8%E6%8E%92%E5%88%97II.html

视频讲解:https://www.bilibili.com/video/BV1R84y1i7Tm

Tips:

解法1就是需要在上一道题的基础上进行同层的去重,因此使用了一个set来记录哪些元素已经被使用过。

解法2更加精炼一些,没有使用到set

我的题解:

解法1:

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

    void backtracking(vector<int>& nums){
        if(path.size()==nums.size()){
            result.push_back(path);
            return;
        }

        // vector<bool> layerUsed = vector<bool>(nums.size(),false);

        unordered_set<int> uset;

        for(int i = 0; i<nums.size(); i++){
            if(uset.find(nums[i])!=uset.end()||used[i]){
                continue;
            }

            used[i] = true;
            uset.insert(nums[i]);
            path.push_back(nums[i]);
            backtracking(nums);
            path.pop_back();
            used[i] = false;
        }
    }

    vector<vector<int>> permuteUnique(vector<int>& nums) {
        used = vector<bool>(nums.size(), false);
        // sort(nums.begin(),nums.end());
        backtracking(nums);
        return result;
    }
};

解法2:

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

    void backtracking(vector<int>& nums){
        if(path.size()==nums.size()){
            result.push_back(path);
            return;
        }

        for(int i = 0; i<nums.size(); i++){
            if(i > 0 && nums[i] == nums[i-1] && used[i - 1] == false){
                continue;
            }
            if(used[i] == false){
                used[i] = true;
                path.push_back(nums[i]);
                backtracking(nums);
                path.pop_back();
                used[i] = false;
            }
        }
    }

    vector<vector<int>> permuteUnique(vector<int>& nums) {
        used = vector<bool>(nums.size(), false);
        sort(nums.begin(),nums.end());
        backtracking(nums);
        return result;
    }
};

标签:排列,nums,46,47,used,vector,result,path,size
From: https://www.cnblogs.com/GavinGYM/p/17090422.html

相关文章

  • 最完美WIN10_Pro_22H2.19045.2546软件选装纯净版VIP39.0
    【系统简介】=============================================================1.本次更新母盘来WIN10_Pro_22H2.19045.2546。进一步优化调整。2.此版本精简量不大,满足各大平......
  • POJ 3468(树状数组+区间修改)
    题目描述给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一:1、“Clrd”,表示把A[l],A[l+1],…,A[r]都加上d。2、“Qlr”,表示询问数列中第l~r个数的和......
  • POJ3468 A Simple Problem with Integers(SplayTree做法)
    DescriptionYouhave N integers, A1, A2,..., AN.Youneedtodealwithtwokindsofoperations.Onetypeofoperationistoaddsomegivennumbertoea......
  • P4770 [NOI 2018] 你的名字
    因为做的题太少所以不放在SAM集合里了捏,有时间(可能没时间)会补一个集合。题意:给\(S\)串和\(T\)串,和\(l_i,r_i\),求\(T\)中有多少子串和\(S[l_i,r_i]\)中的任意......
  • 算法分享之下一个排列
    问题描述考虑一组数字123,其排列组合共有六种:123,132,213,231,312,321。这些排列组合是根据<比较符按数值排序。在这六种排列组合中,123排第一位,没有上一个排列;321......
  • BM46 最小的K个数
    https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=295&tqId=23263&ru=%2Fpractice%2F253d2c59ec3e4bc68da16833f79a38e4&qru=%2Fta%2Fformat-top......
  • hive的Caused by: org.apache.hadoop.hdfs.BlockMissingException: Could not obtain
    早上起来去跑个hive的sql,稍微复杂点sql,就会报错如Causedby:org.apache.hadoop.hdfs.BlockMissingException:Couldnotobtainblock:BP-572947236等,经过一个一个小时......
  • 力扣---2047. 句子中的有效单词数
    句子仅由小写字母('a'到'z')、数字('0'到'9')、连字符('-')、标点符号('!'、'.'和',')以及空格('')组成。每个句子可以根据空格分解成一个或者多个token,这些token之间由......
  • LeetCode.1047 删除字符串中的所有相邻重复项
    1.题目给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在S上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后......
  • leetcode 中等(设计):[146, 155, 208, 211, 284, 304, 307, 341, 355, 380]
    目录146.LRU缓存155.最小栈208.实现Trie(前缀树)211.添加与搜索单词-数据结构设计284.顶端迭代器304.二维区域和检索-矩阵不可变307.区域和检索-数组可修......