【刷题篇】回溯算法(深度优先搜索(一))

news2024/12/24 9:40:22

文章目录

  • 无重复字符串的排列组合
  • 员工的重要性
  • 图像渲染
  • 被围绕的区域

无重复字符串的排列组合

无重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同。

在这里插入图片描述

class Solution {
public:
    void DFS(string &s,vector<string>&dfs,int i)
    {
        if(i==s.size())
            dfs.push_back(s);
        else
        {
            //注意 j 的下标从 i 开始,因为原排列也是一种排列
            for (int j = i; j < s.length(); ++ j)
            {
                swap(s[i], s[j]);       //交换字母
                DFS(s, dfs, i + 1);
                swap(s[i], s[j]);       //还原
            }
        }
    }
    vector<string> permutation(string S) {
        vector<string> res;
        DFS( S,res, 0);
        return res;
    }
};

员工的重要性

给定一个保存员工信息的数据结构,它包含了员工唯一的 id,重要度和直系下属的id比如,员工1是员工2的领导,员工2 是员工3 的领导。他们相应的重要度为 15,10,5。那么员工1的数据结构是[1,15,[2]],员工2的 数据结构是 2, 10,[3]],员工3 的数据结构是[3,5,。注意虽然员工3 也是员工1的一个下属,但是由于并不是直系下属,因此没有体现在员工1的数据结构中。
现在输入一个公司的所有员工信息,以及单个员工id,返回这个员工和他所有下属的重要度之和

在这里插入图片描述

class Solution {
public:

    int DFS(vector<Employee*>& employees,int id)
    {
        int sum=0;
        //先遍历数组employees[],
        for(auto e : employees)
        { 
            //确定是哪个id
            if(e->id==id)
            {
                //将importance的值先赋值给sum最后都会递归返回
                sum=e->importance;
                //这里遍历subordinates依次遍历
                for (auto n : e->subordinates) 
                {
                    sum += DFS(employees, n);
                }
            }
        }
        return sum;
    }

    int getImportance(vector<Employee*> employees, int id) {
        return DFS(employees,id);
    }
};

图像渲染

有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。
你也被给予三个整数 sr , sc 和 newColor 。你应该从像素 image[sr][sc] 开始对图像进行 上色填充 。
为了完成 上色工作 ,从初始像素开始,记录初始坐标的 上下左右四个方向上 像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应 四个方向上 像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为 newColor 。
最后返回 经过上色渲染后的图像 。
在这里插入图片描述

class Solution {
public:
    int dfs[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    void DFS(vector<vector<int>>& image, int sr, int sc, int color,vector<vector<int>>& sign,int row,int col,int oldcolor)
    {
        //渲染并做标记
        image[sr][sc]=color;
        sign[sr][sc]=1;
        //遍历sr,sc坐标的四个方向
        for(int i=0;i<4;i++)
        {
            int newsr=sr+dfs[i][0];
            int newsc=sc+dfs[i][1];
            //判断越界
            if(newsr>=row||newsr<0||newsc>=col||newsc<0)
                continue;
            if(image[newsr][newsc]==oldcolor&&sign[newsr][newsc]==0)
            {
                DFS(image,newsr,newsc,color,sign,row,col,oldcolor);
            }
        }

    }

    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {
        if(image.empty())
            return image;
        int row=image.size();
        int col=image[0].size();
        int oldcolor=image[sr][sc];
        //这里的oldcolor是必须要传的,因为只有和image[sr][sc];相等的数才会被渲染
        vector<vector<int>> sign(row,vector<int>(col,0));
        //上面的数组用于标记,以防重复遍历
        DFS(image,sr,sc,color,sign,row,col,oldcolor);
        return image;
    }
};

被围绕的区域

给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。
在这里插入图片描述

思路:该题是和上一道题的解题步骤有一部分相似,该题是让找出被X包围的O,所以现在就先找出没有被包围的O做好标记,而O的四个方向也会被连起来导致不会被包围。标记的作用也是为了反复查找。

class Solution {
public:
    int next[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    void DFS(vector<vector<char>>& board,int row,int col,int curX,int curY)
    {
        //先将没有被包围的O进行标记,也是防止重复递归
        board[curX][curY]='A';
        for(int i=0;i<4;i++)
        {
            int newsr=curX+next[i][0];
            int newsc=curY+next[i][1];
            //判断越界
            if(newsr>=row||newsr<0||newsc>=col||newsc<0)
                continue;
            //挨着的O也是属于没有被包围的
            if(board[newsr][newsc]=='O')
                DFS(board,row,col,newsr,newsc);
        }
    }
    void solve(vector<vector<char>>& board) {
        int row=board.size();
        int col=board[0].size();
        //判断第一行和最后一行是否有O
        for(int j=0;j<col;j++)
        {
            if(board[0][j]=='O')
                DFS(board,row,col,0,j);
            if(board[row-1][j]=='O')
                DFS(board,row,col,row-1,j);
        }
        //判断第一列和最后一列是否有O
        for(int i=0;i<row;i++)
        {
            if(board[i][0]=='O')
                DFS(board,row,col,i,0);
            if(board[i][col-1]=='O')
                DFS(board,row,col,i,col-1);
        }
        //最后将A改回O,就是没有被包围的,将O改为X就是将包围的改为X
        for(int i=0;i<row;i++)
        {
            for(int j=0;j<col;j++)
            {
                if(board[i][j]=='O')
                    board[i][j]='X';
                if(board[i][j]=='A')
                    board[i][j]='O';
            }
        }
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1034183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手撸列表数据内嵌动态th甘特图

需求如图&#xff1a;日期为后端返回的七天日期&#xff0c;这七天组成由甘特图内嵌展示。 解决思路&#xff1a;这个vue项目中el-table自带样式过多&#xff0c;且不方便动态渲染数据&#xff0c;所以用div模拟了&#xff0c;这里甘特图精度为半天所以用v-if判断了&#xff0…

echarts三柱图叠加三柱图解法

需求如图所示。 解决思路1&#xff1a;实际展示柱体魏三叠加柱的和&#xff0c;那么把每个和计算出来作为一个柱的数组&#xff08;此柱实际展示&#xff09;&#xff0c;为了tootip方便自定义取数据且不用每个都查询原始数据&#xff0c;做叠加柱为一般、严重、危急&#xff…

FastChat 大模型部署推理;Baichuan2-13B-Chat测试、chatglm2-6b测试

参考&#xff1a; https://github.com/lm-sys/FastChat https://blog.csdn.net/qq128252/article/details/132759107 ##安装 pip3 install "fschat[model_worker,webui]"1、chatglm2-6b测试 python3 -m fastchat.serve.cli --model-path ./chatglm2-6b --num-gpus …

【JVM内存区域及创建对象的过程】

文章目录 JVM内存区域及创建对象的过程JVM内存区域JDK1.6、1.7、1.8内存区域的变化&#xff1f;创建对象的过程类的声明周期&#xff1a; JVM内存区域及创建对象的过程 JVM内存区域 JVM 内存区域最粗略的划分可以分为 堆 和栈&#xff0c;当然&#xff0c;按照虚拟机规范&…

Vue页面快速使用阿里巴巴矢量图标库

前面我已经写个一篇文章 阿里巴巴矢量图标如何使用_turbo夏日漱石的博客-CSDN博客 这篇文章非常详细地讲解了在html页面中如何使用阿里巴巴矢量图标库 下面我们讲解在vue页面中引入阿里巴巴矢量图标库icon的几种方法 目录 一、引入在线链接 1、 第九步链接引入在vue中应该是在…

python小程序 图书馆图书借阅借还管理系统 mbc21

为设计一个安全便捷&#xff0c;并且使借阅者更好获取本图书借还信息&#xff0c;本文主要有安全、简洁为理念&#xff0c;实现借阅者快捷寻找图书借还信息&#xff0c;从而解决图书借还信息复杂难辨的问题。该系统以django架构技术为基础&#xff0c;采用python语言和MySQL数据…

科学数据分析和图形绘制软件GraphPad Prism 9 mac中文版特点介绍

Prism 9 mac是一款专业的科学数据分析和图形绘制软件&#xff0c;可用于在生物、医学、化学等领域进行数据分析、绘制图形、进行统计分析等。 Prism 9 mac软件特点 1. 多种数据分析功能&#xff1a;Prism 9提供了多种常见的数据分析工具&#xff0c;包括线性回归、ANOVA、t检验…

如何利用物联网技术打造新型智能餐饮连锁店

中国是美食大国&#xff0c;餐饮美食的消费需求庞大&#xff0c;随着餐饮产业的标准化、规模化发展&#xff0c;餐饮店的连锁化率在持续上升&#xff0c;许多餐饮知名品牌都开设了成百上千家连锁店。随着餐饮连锁店数量的增加&#xff0c;对品牌店铺的管理和运营难度也日益增长…

flowable可使用元素介绍

1. 事件 Events 事件描述图标空启动事件空启动事件未指定触发器&#xff0c;由用户调用的启动事件。定时启动事件定时启动事件在指定时间内创建一次或多次的流程实例。消息启动事件消息启动事件使用具名消息启动流程实例。消息名用于定位指定的启动事件。一个流程定义不得包含…

差值结构的顺序偏好

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由5张二值化的图片组成&#xff0c;让A 中有5个点&#xff0c;B中有1个点&#xff0c;且不重合&#xff0c;统计迭代次数并排序。 第一种情况 差值结构 迭代次数 L E - - 2 10491.…

Qt QCustomPlot介绍

介绍 主要介绍qcustomplot及其用法 最新版本:QCustomPlot Patch Release 2.1.1//November 6, 2022 下载:https://www.qcustomplot.com/index.php/download 官网:https://www.qcustomplot.com/index.php 简单使用 mainwindow.h /**************************************…

gateway之整合sentinel流控降级

文章目录 什么是流控降级为什么要流控降级流控降级带来的好处 gateway如何整合sentinel代码示例 总结 什么是流控降级 流控降级是一种在高并发场景下保护系统可用性的策略&#xff0c;它通过对系统的流量进行控制和管理&#xff0c;以防止系统资源耗尽和崩溃。当系统面临压力过…

【c#-Nuget 包“在此源中不可用”】 Nuget package “Not available in this source“

标题c#-Nuget 包“在此源中不可用”…但 VS 仍然知道它吗&#xff1f; (c# - Nuget package “Not available in this source”… but VS still knows about it?) 背景&#xff1a; 今日从公司svn 上拉取很久很久以前的代码&#xff0c;拉取下来200报错&#xff0c;进一步发…

这些代码转换工具太香了

B站|公众号&#xff1a;啥都会一点的研究生 前言 当有需求将某语言实现的脚本转换为另一语言时&#xff0c;尽管许多概念在不同语言之间是相通的&#xff0c;但每种语言仍然在语法与风格上存在差别 在时间充裕的情况下可以花时间学习一门新语言&#xff0c;但随着AI的发展&a…

rocketmq-spring-boot-starter 2.1.0 事务消息移除参数txProducerGroup

statrer引入 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.3</version></dependency> starter 2.0.2对应rocketmq 4.4.0 starter 2.1.0对应rocke…

vcruntime140_1.dll 无法继续执行代码的修复方法分享

vcruntime140_1.dll 是一个动态链接库文件&#xff0c;它包含了 C运行时库的一些函数和类&#xff0c;例如全局对象、异常处理、内存管理、文件操作等。它是 Visual Studio 2015 及以上版本中的一部分&#xff0c;用于支持 C应用程序的运行。如果 vcruntime140_1.dll 无法继续执…

C语言自定义类型讲解:结构体,枚举,联合(1)

&#x1f435;本篇文章将对结构体相关知识进行讲解 1.结构体&#x1f5a5;️ 1.1结构体定义 结构体&#xff08;struct&#xff09;是用户自定义的数据类型&#xff0c;用于组合一个或多个不同类型的数据成员 1.2结构体的声明 这里直接以代码为例 1.3特殊的声明 不完全声明或…

Windows 基于Visual Studio 开发Qt 6 注意事项

前提条件&#xff1a; 1、Visual Studio 2022 社区版(免费版) 2、Qt-6.5.1版本 Qt Vistual Studio Tools下载 先打开Visual Studio 2022 社区版 &#xff1a; 点击扩展-》管理拓展按钮后&#xff0c;在搜索框中输入Qt&#xff0c;点击这里第一个扩展安装。 Qt Visual Stud…

Matlab信号处理:FFT频谱分辨率

频谱分辨率&#xff1a; 其中为采样间隔&#xff0c;为采样点数。 FFT分辨率&#xff1a; 其中为采样频率&#xff0c;为FFT点数。 有两正弦函数&#xff0c;频率分别为 f1 1Hz&#xff0c;f2 10Hz&#xff0c;f3 40Hz&#xff1b; 示例1&#xff1a; 采样频率 fs 1000H…

LwIP笔记02:

一、LwIP源文件 api&#xff1a;NETCONN API 和 Socket API 相关的源文件&#xff0c;在有操作系统环境下使用 apps&#xff1a;应用程序源文件&#xff0c;如http、mqtt、tftp等 core&#xff1a;LwIP内核源文件 include&#xff1a;LwIP所有模块对应的头文件 netif&…