代码随想录算法训练营29期Day29|LeetCode 491,46,47

news/2024/7/20 23:11:26 标签: 算法, leetcode, 深度优先, c++, 职场和发展

文档讲解:递增子序列  全排列  全排列II

491.递增子序列

题目链接:https://leetcode.cn/problems/non-decreasing-subsequences/description/

思路:

        首先我们开一个vector作为子序列数组。在搜索的每一层中,我们枚举nums数组中的每一个数字,判断是否大于等于vector中的最后一个数,如果是,则加入,然后进入下层搜索,如果不是,则接着枚举。同时为了去重,我们在每层循环中开一个bool数组,记录前面出现的数字。如果枚举到的数字出现过,直接跳过即可。

核心代码:

class Solution {
private:
    vector<vector<int>> ans;
    vector<int> rec;
    void dfs(vector<int>& nums,int x){
        if(rec.size()>1) ans.push_back(rec);   
        bool flag[205];
        memset(flag,false,sizeof(flag));
        for(int i=x;i<nums.size();i++){
            if(nums[i]>=rec.back()&&!flag[nums[i]+100]){
                rec.push_back(nums[i]);
                dfs(nums,i+1);
                rec.pop_back();
                flag[nums[i]+100]=true;
            }
        }
        return;
    }
public:
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        bool flag[205];
        memset(flag,false,sizeof(flag));
        for(int i=0;i<nums.size()-1;i++){
            if(flag[nums[i]+100]) continue;
            flag[nums[i]+100]=true;
            rec.push_back(nums[i]);
            dfs(nums,i+1);
            rec.pop_back();
        }
        return ans;
    }
};

46.全排列

题目链接:https://leetcode.cn/problems/permutations/description/

思路:

        本题很简单。假设nums数组大小为n。每层搜索枚举一个当前位置的数,搜索到第n+1层时一个排列就完成了,将当前排列加入答案即可。当所有搜索完成后,全排列就完成了。

        注意每层搜索有可能枚举相同位置的数,因此要开一个全局的bool数组作为标识,记录某位置是否被使用过,如果没被使用过,标记其被使用,加入排列进入下层循环。如果已经被使用了,跳过即可。

        注意回溯时要取消标记,将加入排列的数退出。

核心代码:

class Solution {
private:
    bool flag[10];
    vector<vector<int>> ans;
    vector<int> path;
    void dfs(vector<int>& nums,int x){
        if(x==nums.size()){
            ans.push_back(path);
            return;
        }
        for(int i=0;i<nums.size();i++){
            if(flag[i]) continue;
            path.push_back(nums[i]);
            flag[i]=true;
            dfs(nums,x+1);
            path.pop_back();
            flag[i]=false;
        }
        return;
    }
public:
    vector<vector<int>> permute(vector<int>& nums) {
        memset(flag,false,sizeof(flag));
        dfs(nums,0);
        return ans;
    }
};

47.全排列II

题目链接:https://leetcode.cn/problems/permutations-ii/description/

思路:

        本题与上道题目几乎一致。唯一需要注意的有两点:

        1.每层搜索不能使用前面层搜索过的相同位置的数。

        2.每层搜索内不能使用相同大小的数,因为当前位置使用相同的数产生的是相同的排列。

        第一点上一题解决了,不再赘述。第二点需要我们在循环内开一个bool数组进行标记。枚举每个数都要进行判断,没被用过就可以用,然后打上标记。用过了则跳过即可。

核心代码:

class Solution {
private:
    bool flag[10];
    vector<vector<int>> ans;
    vector<int> path;
    void dfs(vector<int>& nums,int x){
        if(x==nums.size()){
            ans.push_back(path);
            return;
        }
        bool book[25];
        memset(book,false,sizeof(book));
        for(int i=0;i<nums.size();i++){
            if(flag[i]||book[nums[i]+10]) continue;
            book[nums[i]+10]=true;
            path.push_back(nums[i]);
            flag[i]=true;
            dfs(nums,x+1);
            path.pop_back();
            flag[i]=false;
        }
        return;
    }
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        memset(flag,false,sizeof(flag));
        dfs(nums,0);
        return ans;
    }
};

今日总结

        今日学习时长2h,题目还算可以,今天做题状态很好。


http://www.niftyadmin.cn/n/5345624.html

相关文章

前端项目打包使用nginx本地服务器运行

1.下载安装nginx nginx: 下载nginx 中文网提供nginx中文文档nginx下载等内容https://nginx.p2hp.com/en/download.html 稳定版就可以&#xff0c;下载完后将下载的压缩包解压 2.修改配置文件 主要修改端口&#xff0c;以及项目所在文件夹&#xff0c;直接放html下就行 server …

Java 枚举和注解

一、枚举类 把具体的对象一个一个例举出来的类就称为枚举类 枚举对应英文(enumeration, 简写 enum)枚举是一组常量的集合。可以这里理解&#xff1a;枚举属于一种特殊的类&#xff0c;里面只包含一组有限的特定的对象。 1.实现方式1——自定义类实现枚举 public class Enume…

有向图的拓扑序列——拓扑排序

问题描述 什么是拓扑序列 若一个由图中所有点构成的序列 A 满足&#xff1a;对于图中的每条边 (x,y)&#xff0c;x 在 A 中都出现在 y 之前&#xff0c;则称 A 是该图的一个拓扑序列。图中不能有环图中至少存在一个点的入度为0 如何求拓扑序列&#xff1f; 计算出每个节点的…

网络原理-初识(2)

协议分层 对于网络协议来说,往往分成几个层次进行定义. 网络通信的过程中,需要涉及到的细节,其实非常多.如果要有一个协议来完成网络通信,就需要约定好方方面面的内容,导致非常复杂. 而如果拆分的话,就十分复杂,庞大,因此需要分层. 什么是协议分层 即只有相邻的层次可以沟通,…

科大讯飞 再次引爆Ai

去年「科大讯飞版ChatGPT」星火大模型刚上线的时候&#xff0c;小编给大家推荐过一波&#xff0c;演示了其强大的功能&#xff0c;不少小伙伴都立马申请体验了一把&#xff0c;有小伙伴还私信我说功能非常强大&#xff0c;工作效率提高不少&#xff0c;支持国产大模型之类赞扬。…

数据脱敏(三)脱敏算法-遮盖算法

脱敏算法篇使用阿里云数据脱敏算法为模板,使用算子平台快速搭建流程来展示数据 遮盖脱敏是一种数据脱敏技术&#xff0c;它的主要目的是通过隐藏或替换敏感信息来保护数据安全&#xff0c;同时保持数据的其他特性不变&#xff0c;以便于数据的进一步使用和分析。这种脱敏技术适…

stm32 裸机点亮led

stm32不用库 裸机点亮led startup.s 定义栈入口函数 进入main .syntax unified .cpu cortex-m3 .fpu softvfp .thumb.global vtable .global reset_handler.type vtable, %object vtable:.word _estack.word reset_handler .size vtable, .-vtable.type reset_handler, %funct…

【水文】简易时钟

/* 制作的一个能显示时间的简易时钟 */ #include <stdio.h> #include <stdlib.h> #include <time.h> #include <windows.h> // 带颜色的打印函数 void print_with_color(char *str, int color) { HANDLE hConsole GetStdHandle(STD_OUTPUT_HAND…