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

news/2024/11/28 23:48:10/

文章目录

  • 岛屿数量
  • 电话号码的字母组合
  • 组合总和
  • 活字印刷

岛屿数量

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
在这里插入图片描述

class Solution {
public:int num=0;int next[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
public:void findisland(vector<vector<char>>& grid,int row,int col,vector<vector<int>>& sign,int nowr,int nowc){if(grid[nowr][nowc]=='1'&&sign[nowr][nowc]==0){sign[nowr][nowc]=1;for(int i=0;i<4;i++){    int newsr=nowr+next[i][0];int newsc=nowc+next[i][1];//防止越界if(newsr>=row||newsr<0||newsc>=col||newsc<0)continue;findisland(grid,row,col,sign,newsr,newsc);}}}int numIslands(vector<vector<char>>& grid) {if(grid.empty())return 0;int row=grid.size();int col=grid[0].size();//创建标记数组,防止重复访问vector<vector<int>> sign(row,vector<int>(col,0));for(int i=0;i<row;i++){for(int j=0;j<col;j++){    //要确保他是岛屿并且没有被标记过,才会继续访问,来怎加岛屿数量if(grid[i][j]=='1'&&sign[i][j]==0){findisland(grid,row,col,sign,i,j);num++; }}}return num;}
};

电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
在这里插入图片描述

map<char,string> numMap={{'2',"abc"},{'3',"def"},{'4',"ghi"},{'5',"jkl"},{'6',"mno"},{'7',"pqrs"},{'8',"tuv"},{'9',"wxyz"}};
class Solution {
public:void DFS(string & digit,vector<string>& allRet,string curStr,int digitIdx){//放入数组if(digitIdx==digit.size()){allRet.push_back(curStr);return;}//获取数字对应的字符映射string strMap=numMap[digit[digitIdx]];for(char e: strMap){DFS(digit,allRet,curStr+e,digitIdx+1);}}vector<string> letterCombinations(string digits) {vector<string> vec;if(digits.empty()){return vec;}DFS(digits,vec,"",0);return vec;}
};

组合总和

给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 target 的唯一组合。
candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的唯一组合数少于 150 个。
在这里插入图片描述

class Solution {
public:void DFS(vector<int>& candidates,vector<vector<int>>& allsum,vector<int>& cursum, int target,int sum,int prev){if(sum>=target){if(sum==target){//相等的话就插入最终的数组allsum.push_back(cursum);}//只大于的话就返回并pop出一个数据return;}for(int i=prev;i<candidates.size();i++){//插入临时数组进行保存cursum.push_back(candidates[i]);DFS(candidates,allsum,cursum,target,sum+candidates[i],i);cursum.pop_back();//回溯}}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {//用来存放最终返回的结果,vector<vector<int>> allsum;//用来记录临时储存的结果vector<int> cursum;//记录数据大小与target的比较int sum=0;//DFS当中的prev也就是0的作用是用来控制循环DFS(candidates,allsum,cursum,target,sum,0);return allsum;}
};

活字印刷

你有一套活字字模 tiles,其中每个字模上都刻有一个字母 tiles[i]。返回你可以印出的非空字母序列的数目。
注意:本题中,每个活字字模只能使用一次。
在这里插入图片描述

class Solution {
public:void DFS(string& tiles,string curstr,unordered_set<string>& allret,vector<int>& book){if(!curstr.empty()){allret.insert(curstr);}for(int i=0;i<tiles.size();i++){if(book[i]==0){book[i]=1;DFS(tiles,curstr+tiles[i],allret,book);book[i]=0;//回溯}}}int numTilePossibilities(string tiles) {if(tiles.empty()){return 0;}//使用它也已去重unordered_set<string> allret;//标记,回溯vector<int> book(tiles.size(),0);//临时string curstr;DFS(tiles,curstr,allret,book);return allret.size();}
};

http://www.ppmy.cn/news/1141061.html

相关文章

【Verilog】画出下列wave信号波形图

题目分析与仿真参考答案 题目 画出下列wave信号波形图。 分析与仿真 从0时刻开始&#xff0c;wave初值为0&#xff0c;持续50个时间单位 接下来wave变为1&#xff0c;持续100个时间单位&#xff0c;此时的时间是50 100 150 接下来wave变为0&#xff0c;持续100个时间单位&a…

day10.8ubentu流水灯

流水灯 .text .global _start _start: 1.设置GPIOE寄存器的时钟使能 RCC_MP_AHB4ENSETR[4]->1 0x50000a28LDR R0,0X50000A28LDR R1,[R0] 从r0为起始地址的4字节数据取出放在R1ORR R1,R1,#(0x1<<4) 第4位设置为1STR R1,[R0] 写回2.设置PE10管脚为输出模式 G…

Java RPC调用: 远程过程调用的实现与应用

远程过程调用&#xff08;RPC&#xff09;是一种允许程序在不同计算机之间进行通信的协议。它通过将本地函数调用转化为远程函数调用来实现分布式计算。在Java中&#xff0c;可以使用一些RPC框架实现远程过程调用&#xff0c;如Apache Thrift和gRPC。 用法: Java中的RPC调用可…

k8s集群-7 service

工作负载的应用是如何暴露出去的 解决访问问题 Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service&#xff0c;应用可以方便地实现服务发现和负载均衡。 service默认只支持4层负载均衡能力&#xff0c;没有7层功能。(可以通过Ingress实现) service的类型: C…

数据科学家的编程语言

数据科学家的编程语言 在今天有256种编程语言可供选择&#xff0c;选择要学习的语言可能会令人不知所措和困难。有些语言更适用于构建游戏&#xff0c;而有些更适用于软件工程&#xff0c;还有一些更适用于数据科学。 编程语言的类型 低级编程语言是计算机用来执行操作的最容…

数据结构学习:数据结构概念了解

数据结构课程的起源 1968年高德纳教授开创了数据结构这门学科&#xff0c;同年&#xff0c;数据结构作为计算机科学的学位课程。 数据结构研究什么 研究非数值计算类型的程序问题&#xff1b; 研究数据之间的组织和操作方式&#xff1b; 研究数据的逻辑结构和存储结构&#xf…

kafka、rabbitmq 、rocketmq的区别

一、语言不同 RabbitMQ是由内在高并发的erlanng语言开发&#xff0c;用在实时的对可靠性要求比较高的消息传递上。 kafka是采用Scala语言开发&#xff0c;它主要用于处理活跃的流式数据,大数据量的数据处理上 二、结构不同 RabbitMQ采用AMQP&#xff08;Advanced Message Q…

Jenkins配置钉钉通知

Jenkins 作为最流行的开源持续集成平台&#xff0c;其强大的拓展功能一直备受测试人员及开发人员的青睐。大家都知道我们可以在 Jenkins 中安装 Email 插件支持构建之后通过邮件将结果及时通知到相关人员。 但其实 Jenkins 还可以支持钉钉消息通知&#xff0c;其主要通过 Ding…