牛客101:递归/回溯

牛客面试算法top101(JAVA和C++) 立即下载

目录

一、没有重复项数字的全排列

二、有重复项数字的全排列

三、岛屿数量

四、字符串的排列

五、N皇后

六、括号生成

七、矩阵最长递增路径


这个专栏写得很顺畅

一、没有重复项数字的全排列

没有重复项数字的全排列_牛客题霸_牛客网

无重复->暴力枚举,check剪枝

牛客这边好像类内成员属性不给初始化的,所以将其设置为全局变量。

#include <vector>
bool check[7];
vector<int> path;
vector<vector<int>> ret;
int _n;
class Solution {
public:
    vector<vector<int> > permute(vector<int>& num) {
        _n=num.size();
        //题目要求
        sort(num.begin(),num.end());
        dfs(num);
        return ret;
    }
    void dfs(vector<int>&num)
    {
        if(path.size()==_n)
        {
            ret.push_back(path);
            return;
        }
        for(int i=0;i<_n;++i)
        {
            if(!check[i])
            {
                check[i]=true;
                path.push_back(num[i]);
                dfs(num);
                check[i]=false;
                path.pop_back();
            }
        }
    }
};

二、有重复项数字的全排列

有重复项数字的全排列_牛客题霸_牛客网

有重复?排序+check分层判断

bool check[9];
int _n;
vector<int> path;
vector<vector<int>> ret;
class Solution {
public:
    vector<vector<int> > permuteUnique(vector<int>& num) {
        _n=num.size();
        sort(num.begin(),num.end());
        dfs(num);
        return ret;
    }
    void dfs(vector<int>&num)
    {
        if(path.size()==_n)
        {
            ret.push_back(path);
            return;
        }
        for(int i=0;i<_n;++i)
        {
            if(!check[i])
            {
                if(i==0||num[i]!=num[i-1]||check[i-1])
                {
                    check[i]=true;
                    path.push_back(num[i]);
                    dfs(num);
                    path.pop_back();
                    check[i]=false;
                }
            }
        }
    }
};

三、岛屿数量

岛屿数量_牛客题霸_牛客网

check标记

class Solution {
    int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1},m,n;
    bool check[301][301];
public:
    int solve(vector<vector<char>>& grid) {
        m=grid.size(),n=grid[0].size();
        int ret=0;
        for(int i=0;i<m;++i)
        {
            for(int j=0;j<n;++j)
            {
                if(grid[i][j]=='1'&&!check[i][j])
                {
                    ++ret;
                    //check!
                    dfs(grid,i,j);
                }
            }
        }
        return ret;
    }
    void dfs(vector<vector<char>>& grid,int i,int j)
    {
        check[i][j]=true;
        for(int k=0;k<4;++k)
        {
            int x=i+dx[k],y=j+dy[k];
            if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]=='1'&&!check[x][y])
            {
                dfs(grid,x,y);
            }
        }
    }
};

四、字符串的排列

字符串的排列_牛客题霸_牛客网

其实就是有重复元素全排列

int _n;
string path;
vector<string> ret;
bool check[11];
class Solution {
public:
    vector<string> Permutation(string str) {
        _n=str.size();
        sort(str.begin(),str.end());
        dfs(str);
        return ret;
    }
    void dfs(string str)
    {
        if(path.size()==_n)
        {
            ret.push_back(path);
            return;
        }
        for(int i=0;i<_n;++i)
        {
            if(!check[i])
            {
                if(i==0||str[i]!=str[i-1]||check[i-1])
                {
                    check[i]=true;
                    path.push_back(str[i]);
                    dfs(str);
                    path.pop_back();
                    check[i]=false;
                }
            }
        }
    }
};

五、N皇后

N皇后问题_牛客题霸_牛客网

题意要求特判

递归该层处理该行

int _n;
bool Col[10],Dig1[20],Dig2[20];
int ret;
class Solution {
public:
    int Nqueen(int n) {
        _n=n;
        dfs(0);
        return ret;
    }
    void dfs(int row)
    {
        if(row==_n)
        {
            ++ret;
            return;
        }
        for(int col=0;col<_n;++col)
        {
            if(!Col[col]&&!Dig1[row-col+_n]&&!Dig2[row+col])
            {
                Col[col]=Dig1[row-col+_n]=Dig2[row+col]=true;
                dfs(row+1);
                Col[col]=Dig1[row-col+_n]=Dig2[row+col]=false;
            }
        }
    }
};

六、括号生成

括号生成_牛客题霸_牛客网

依旧是根据题目要求,写特殊判断

int _n;
string path;
vector<string> ret;
class Solution {
public:
    vector<string> generateParenthesis(int n) {
        _n=n;
        dfs(0,0);
        return ret;
    }
    //dfs每层保证右括号数量<=左括号数量,并且二者数量都不能超过n
    void dfs(int LeftNum,int RightNum)
    {
        if(RightNum==_n)
        {
            ret.push_back(path);
            return;
        }
        if(LeftNum<_n)
        {
            path.push_back('(');
            dfs(LeftNum+1,RightNum);
            path.pop_back();
        }
        if(RightNum<LeftNum)
        {
            path.push_back(')');
            dfs(LeftNum,RightNum+1);
            path.pop_back();
        }
    }
};

七、矩阵最长递增路径

矩阵最长递增路径_牛客题霸_牛客网

dfs+记忆化搜索

#include <vector>
int memo[1001][1001],dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
int _m,_n,ret;
class Solution {
public:
    int solve(vector<vector<int> >& matrix) {
        _m=matrix.size(),_n=matrix[0].size();
        for(int i=0;i<_m;++i)
        {
            for(int j=0;j<_n;++j)
            {
                ret=max(ret,dfs(matrix,i,j));
            }
        }
        return ret;
    }
    int dfs(vector<vector<int>>&matrix,int i,int j)
    {
        if(memo[i][j])return memo[i][j];
        int path=1;
        for(int k=0;k<4;++k)
        {
            int x=i+dx[k],y=j+dy[k];
            if(x>=0&&x<_m&&y>=0&&y<_n&&matrix[x][y]>matrix[i][j])
            {
                path=max(path,dfs(matrix,x,y)+1);
            }
        }
        memo[i][j]=path;
        return path;
    }
};

此篇完。

最轻松的一个专栏,*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。

告别版本过低提示!微信3.9登录修复与聊天记录无缝迁移全攻略 本文详细解析了微信3.9版本过低提示的根源,并提供了完整的修复方案和聊天记录迁移指南。通过专用修复工具绕过版本检测,以及新旧版本聊天记录目录对比,帮助用户实现无缝迁移。特别提醒备份重要数据,确保操作安全。 阅读详情

相关推荐

微型纵向加密在新能源场站中的实战部署与运维避坑指南

本文详细解析了微型纵向加密在新能源场站中的实战部署与运维技巧。通过国密算法SM4实现数据加密,确保新能源场站通信安全,同时提供非侵入式部署方案和运维避坑指南,帮助提升网络稳定性和运维效率。

weixin_30505225的博客 598

牛客TOP101之链表篇(高效刷题,带你手撕算法)

1、反转链表 1、给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。 如当输入链表{1,2,3}时, 经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。 以上转换过程如下图所示: 输入:{1,2,3} 返回值:{3,2,1} 输入:{} 返回值:{} 说明:空链表则输出空 常规思路:迭代 具体细节:在遍历链表时,将当前节点的next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个

qq_36317312的博客 3474

从零到一:Admin.NET中Swagger与Knife4jUI的深度集成实践

本文详细介绍了在Admin.NET框架中深度集成Swagger与Knife4jUI的实践方法,从基础配置到高级定制,包括认证配置、安全增强、界面主题定制等。通过Furion框架简化配置,开发者可以快速构建专业且友好的API文档界面,提升团队协作效率。

defi6farmer的博客 408

牛客编程题--必刷101之字符串(高效刷题,举一反三)

文章目录1、 字符串变形 1、 字符串变形 题目描述:对于一个长度为 n 字符串,我们需要对它做一些变形。 首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。 比如"Hello World"变形后就变成了"wORLD hELLO"。 输入:“This is a sample”,16 返回值: “SAMPLE A IS tHIS” ......

qq_36317312的博客 2067

STM32——IIC(I2C)中断与DMA通信实战解析

本文深入解析STM32的IIC(I2C)通信中断与DMA实战应用。通过对比轮询方式的低效,详细介绍中断模式和DMA模式的实现原理、状态机编程技巧及性能优化策略,并结合SHT30传感器案例展示如何高效读取数据,显著提升系统响应速度和CPU利用率。

week9的博客 808

别再用MounRiver了!在VSCode里用PlatformIO搞定CH32V208开发(附完整配置流程)

本文详细介绍了如何在VSCode中使用PlatformIO进行CH32V208开发,替代传统的MounRiver Studio。通过完整的配置流程和优化技巧,开发者可以构建高效、现代化的RISC-V开发环境,显著提升编译速度和开发效率。

weixin_28711397的博客 535

牛客编程题--必刷101之递归回溯篇

文章目录补充知识回溯算法经典问题之全排列1、没有重复项数字的全排列回溯 + 递归 补充知识 该补充知识内容是参考laluladong作者的算法文档 回溯算法 回溯算法实际上是一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。 解决⼀个回溯问题,实际上就是⼀个决 策树的遍历过程 你只需要思考 3 个问题: 1、路径:也就是已经做出的选择。 2、选择列表:也就是你当前

qq_36317312的博客 1605

Linux安装Oracle sqlplus客户端工具

Linux安装Oracle sqlplus客户端工具

优快云_Nan_Jiang_Li的博客 2777

【刷题笔记】牛客网面试必刷101刷题笔记(1)

本文主要介绍的是近期刷的一些题的思路和解题过程及代码,今天为大家带来的是面试101的链表题目,也是BM1 - BM16 的所有题目,希望大家看的开心,复习愉快!

AMor_05的博客 790

Raspberry Pi 4 ARM Trusted Firmware 技术解析

摘要: 本文详细介绍了在树莓派4(Raspberry Pi 4)上移植ARM可信固件(TF-A)的实现方案与安全考量。该移植专注于BL31功能,作为非安全世界(如Linux内核)的启动桥梁,支持加载EL2级别程序。文章分析了启动流程、内存映射设计,并对比了RPi3与RPi4的关键差异,指出当前版本缺乏硬件级安全内存保护的局限性。此外,提供了构建指南、配置说明及设备树自动修补的实现细节,强调通过config.txt简单配置即可启动64位内核。该方案充分利用树莓派原有GPU固件流程,兼顾兼容性与简易性。

Linux内核架构师 932

【Kubernetes】Kubernetes 安全沙箱深度对比:gVisor vs Kata Containers

Kubernetes安全沙箱深度对比:gVisor和Kata Containers在架构、性能与安全性方面各有特点。gVisor通过用户态内核(Sentry)实现软件隔离,启动快(毫秒级)但CPU开销大(20-30%),适合Web服务等场景。Kata Containers采用轻量级虚拟机提供硬件级隔离,启动较慢(1-2秒)但兼容性更好,适合金融等高安全需求。测试显示gVisor在动态请求下性能下降33%,而Kata性能接近原生。建议根据场景选择:多租户/快速启动用gVisor,敏感数据/极致安全用Kata,

九师兄 178

【链表篇】速刷牛客TOP101 高效刷题指南

牛客101刷题笔记链表篇

King Gigi的博客 814

YOLO-World:从入门到实战的多模态目标检测全指南

想象一下,你给模型一张“公园”的图片,再输入文字“红色的郁金香”,它能直接在图中框出所有红色郁金香的位置——这就是多模态目标检测:结合图像视觉信息和文本语义信息,同时完成“是什么”(分类)和“在哪里”(定位)的任务。传统目标检测(如YOLOv5、YOLOv8)只能识别预定义的类别(比如训练时学过“猫”“狗”),但多模态目标检测摆脱了“类别预定义”的限制,只要文本能描述,它就能检测,这就是“开放词汇检测(Open-Vocabulary Detection)”的魅力。

know_F0727的博客 205

牛客 《面试刷题 TOP 101》 整整 101 题量大管饱题解套餐 上

牛客 《面试刷题 TOP 101》 整整 101 题量大管饱题解套餐

Lenyiin 2209

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

算法题种类与解题思路全面指南:基于LeetCode Hot 100与牛客Top 101

本文系统梳理了算法题的核心类型与解题思路,重点分析了LeetCode Hot 100和牛客Top 101高频题目。主要内容包括:1)算法复杂度分析基础,介绍时间/空间复杂度及其典型算法;2)高频题目题型分布统计,显示数据结构类(数组、链表、树)和核心算法(动态规划、回溯)占主导;3)详细讲解数组类题目的双指针、前缀和、滑动窗口等解题技巧,以及链表、二叉树等数据结构的常见题型和解法框架。文章为算法刷题提供系统性指导,帮助读者掌握高频考点和核心解题思路。

专注人工智能应用领域 2067

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

牛客网【面试必刷TOP101】~ 06 递归/回溯

掌握全排列的四种顺序(前交换,后交换,移动至前,移动至后);有重复元素的全排列(排序+去重);N皇后(回溯的典型应用);矩阵最长递增路径(dfs+记忆化搜索)

像写诗一样优雅地写代码~ 2695

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

牛客经典101题解题集--递归/回溯

本文涵盖了多个经典算法问题的解决方案,包括排列组合、岛屿计数、字符串排列、N皇后问题和矩阵最长递增路径。主要内容包括: 排列问题:提供了无重复数字和有重复数字的全排列解决方案,使用回溯算法实现,时间复杂度为O(n!)。 岛屿计数:通过深度优先搜索(DFS)计算01矩阵中的岛屿数量,处理相邻陆地视为同一岛屿的情况。 字符串排列:生成输入字符串所有可能的排列组合,处理重复字符情况并返回字典序排列。 N皇后问题:在n×n棋盘上放置n个皇后,确保互不攻击,使用回溯算法计算所有可行解的数量。 矩阵最长递增路径:在矩阵

2301_80113113的博客 571

面试 TOP101 递归/回溯专题题解汇总Java版(BM55 —— BM61)

本文总结了牛客网8月刷题挑战中递归/回溯专题的7道核心题目,包括全排列、岛屿数量、N皇后等经典问题。每道题目提供了核心思路、时间/空间复杂度分析及代码亮点,并按照难度推荐了复习顺序(BM55→BM56→BM57→BM60→BM58→BM61→BM59)。特别展示了BM55(无重复全排列)的两种解法:基础回溯法和记忆数组优化法,均以清晰的代码结构实现排列生成。专题覆盖了回溯剪枝、DFS/BFS应用等关键算法技巧,适合系统提升递归问题解决能力。 关键词:回溯算法、全排列、

YeeSum的博客,对技术充满好奇! 1187

牛客 《面试刷题 TOP 101》 整整 101 题量大管饱题解套餐 下

牛客 《面试刷题 TOP 101》 整整 101 题量大管饱题解套餐

Lenyiin 2398

牛客TOP101学习笔记

这里写目录标题一 链表BM1反转链表BM2链表内指定区间反转BM3链表中的节点每k个一组翻转BM4 合并两个排序的链表BM5 合并k个已排序的链表BM6 判断链表中是否有环BM7 链表中环的入口结点BM8 链表中倒数最后k个结点BM9 删除链表的倒数第n个节点BM10 两个链表的第一个公共结点BM11 链表相加(二)BM12 单链表的排序**BM13 判断一个链表是否为回文结构BM14 链表的奇偶重排BM15 删除有序链表中的重复元素-ⅠBM16 删除链表中的重复元素-Ⅱ二 数组**BM17** 二分查找.

且视他人之疑目如盏盏鬼火,大胆走吾之夜路! 1586

牛客Top101 8/25

如果是线型递归,子问题直接回到父问题不需要回溯,但是如果是树型递归,父问题有很多分支,我需要从子问题回到父问题,进入另一个子问题。因此回溯是指在递归过程中,从某一分支的子问题回到父问题进入父问题的另一子问题分支,因为有时候进入第一个子问题的时候修改过一些变量,因此回溯的时候会要求改回父问题时的样子才能进入第二子问题分支。但是这样递归不能保证括号一定合法,我们需要保证左括号出现的次数比右括号多时我们再使用右括号就一定能保证括号合法了,因此每次需要检查左括号和右括号的使用次数。

m0_46622565的博客 153

牛客面试必刷101代码总结【python】

牛客面试题必刷101代码总结

Anthony_hit的博客 2326

牛客Top101 8/24

矩阵中多处聚集着1,要想统计1聚集的堆数而不重复统计,那我们可以考虑每次找到一堆相邻的1,就将其全部改成0,而将所有相邻的1改成0的步骤又可以使用深度优先搜索(dfs):当我们遇到矩阵的某个元素为1时,首先将其置为了0,然后查看与它相邻的上下左右四个方向,如果这四个方向任意相邻元素为1,则进入该元素,进入该元素之后我们发现又回到了刚刚的子问题,又是把这一片相邻区域的1全部置为0,因此可以用递归实现。都是求元素的全排列,字符串与数组没有区别,一个是数字全排列,一个是字符全排列,因此大致思路与。

m0_46622565的博客 159

3天3刷牛客面试必刷榜单:递归法大总结 - 从入门到精通的编程随想录 无偿分享千行源码+详细思路答题模板

回溯思维: 能够系统地探索所有可能的解决方案,并进行高效剪枝。 树形问题解决能力: 能够灵活运用递归对树进行遍历、计算和结构操作。 复杂问题分解能力: 能够将看似复杂的组合和树问题,分解为可递归解决的子问题。 C语言实战经验: 通过大量带注释的C语言代码,你已经将理论知识转化为实际的编程能力。

c5dnuser的博客 576

[特殊字符] 牛客面试101:链表(上)1-11题

📚《牛客面试101:链表(上)1-11题》摘要 本文系统讲解了链表的核心算法与解题技巧: 1️⃣ 基础操作:包括单/双链表结构、迭代与递归反转算法(O(n)时间,O(1)空间),重点分析断链保护与双指针移动策略。 2️⃣ 高阶变体:详解区间反转(虚拟头+头插法)、K组反转(递归分组)及循环链表实现,强调边界处理技巧。 3️⃣ 经典问题:Floyd环检测算法(快慢指针)的数学证明,链表插入排序的实现与复杂度分析。 4️⃣ 方法论总结:归纳虚拟头、双指针、递归分治等核心技巧,提供不同场景下的最优解法选择指南。

2402_87028704的博客 415

面试 TOP101 专题题解汇总 (完结)

本文总结了牛客网面试TOP101中链表、数组和二叉树相关的高频题目。链表部分涵盖反转、合并、环检测等经典问题,常用快慢指针和虚拟头节点技巧;数组部分包括二分查找、逆序对统计等算法,注重时间复杂度优化;二叉树部分包含三种遍历方式及层序遍历等,采用递归和队列实现。每道题均标注了核心解法、时空复杂度和代码亮点,并附原题链接,适合面试快速复习和核心思路掌握。

YeeSum的博客,对技术充满好奇! 804
上一篇: 【递归、回溯、搜索】专题六:记忆化搜索
下一篇: 牛客101:字符串
_dindong
博客等级 码龄2年 107粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_dindong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值