当前位置: 首页 > news >正文

可不可以建网站做微商最新域名查询ip

可不可以建网站做微商,最新域名查询ip,济宁建网站公司,线上做汉语教师网站dfs思路: 首先通过两层for循环遍历每一个点,如果这个点为0或者2(这个2是什么呢?是在遍历该点以及该点连成的这一片区域中,因为通过深度优先搜索,遍历该点就等于遍历这一片区域,遍历这篇区域中的…

dfs思路:

首先通过两层for循环遍历每一个点,如果这个点为0或者2(这个2是什么呢?是在遍历该点以及该点连成的这一片区域中,因为通过深度优先搜索,遍历该点就等于遍历这一片区域,遍历这篇区域中的点的同时,将这些元素标记为2,即代表这篇区域已经遍历过),那么遍历下一个点。遇到一个新的区域则cnt++。

那么怎么进行深度搜索呢?即如果该点=1,那么将该点的上方、下方、左方、右方送入dfs。

dfs代码:

C++:

class Solution {
public:int p_m[4]={-1,1,0,0};int p_n[4]={0,0,-1,1};void dfs(vector<vector<char>>& grid,int i,int j,int m,int n){for(int k=0;k<4;k++){int x=i+p_m[k];int y=j+p_n[k];if(x>=0 && x<m && y>=0 && y<n){if(grid[x][y]=='0'||grid[x][y]=='2'){continue;}else{grid[x][y]='2';dfs(grid,x,y,m,n);}}}}int numIslands(vector<vector<char>>& grid) {int m=grid.size();int n=grid[0].size();//cout<<m<<' '<<n<<endl;int cnt=0;for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(grid[i][j]=='2'||grid[i][j]=='0'){continue;}else{dfs(grid,i,j,m,n);cnt++;}}}return cnt;}
};

注意:二维数组中,求行数为 

int m=grid.size();

求列数为

int n=grid[0].size();

python:

class Solution:def dfs(self,grid:List[list[str]],i:int,j:int,m:int,n:int) -> int:p_m=[-1,1,0,0]p_n=[0,0,-1,1]for k in range(4):x=i+p_m[k]y=j+p_n[k]if x>=0 and x<m and y>=0 and y<n:if grid[x][y]=='0' or grid[x][y]=='2':continueelse:grid[x][y]='2'self.dfs(grid,x,y,m,n)def numIslands(self, grid: List[List[str]]) -> int:m=len(grid)n=len(grid[0])cnt=0for i in range(m):for j in range(n):if grid[i][j]=='2' or grid[i][j]=='0':continue;else:self.dfs(grid,i,j,m,n)cnt+=1return cnt

bfs思路:

与dfs类似,遍历每个元素时,如果该元素的值为1,那么将其入队列,并且考虑其上下左右的元素,如果周围元素值为1,将其也入队列。遍历一个元素时,如果该值为1,那么代表访问了一个新的区域,则cnt++。

代码:

C++:

class Solution {
public:deque<pair<int,int>> q;int p_x[4]={-1,1,0,0};int p_y[4]={0,0,1,-1};int numIslands(vector<vector<char>>& grid) {int cnt=0;int m=grid.size();int n=grid[0].size();for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(grid[i][j]=='0'||grid[i][j]=='2'){continue;}else{cnt++;}q.push_back({i,j});while(!q.empty()){pair<int,int> temp=q.front();q.pop_front();int temp_x=temp.first;int temp_y=temp.second;if(grid[temp_x][temp_y]=='0'||grid[temp_x][temp_y]=='2'){continue;}else{grid[temp_x][temp_y]='2';for(int k=0;k<4;k++){int x=temp_x+p_x[k];int y=temp_y+p_y[k];if(x>=0 && x<m && y>=0 && y<n){if(grid[x][y]=='0'||grid[x][y]=='2'){continue;}else{q.push_back({x,y});}}}}}}}return cnt;}
};

明显可以看到bfs要比dfs慢的多。

 python:

class Solution:def numIslands(self, grid: List[List[str]]) -> int:q=deque()p_x=[-1,1,0,0]p_y=[0,0,1,-1]cnt=0m=len(grid)n=len(grid[0])for i in range(m):for j in range(n):if grid[i][j]=='0' or grid[i][j]=='2':continueelse:cnt+=1q.append((i,j))while q:temp=q[0]q.popleft()temp_x=temp[0]temp_y=temp[1]if grid[temp_x][temp_y]=='0' or grid[temp_x][temp_y]=='2':continueelse:grid[temp_x][temp_y]='2'for k in range(4):x=temp_x+p_x[k]y=temp_y+p_y[k]if x>=0 and x<m and y>=0 and y<n:if grid[x][y]=='0' or grid[x][y]=='2':continueelse:q.append((x,y))return cnt

注意:C++中的pair<int,int>用python中的tuple来代替

q.append((i,j))

同时,记得添加from collections import deque 

并查集思路:

遍历所有元素,如果该元素为‘0’,则跳过;如果该元素为‘1’,cnt++(岛屿数++,后面再依次向下减),同时为其分配一个Father结点,值为其本身,但是本身是(i,j),该怎么存到Father数组中呢?用二维数组转换成一维数组的方法,即将(i,j)转换为(i*n+j)【相当于以行优先,看是第几个元素】。接下来,依次判断上下左右值,如果为1,就和自己合并。这里分为真合并和假合并,假合并就是这两个值原来就合并过。如果是真合并,则进行cnt--的操作。

并查集代码:

C++:

class Solution {
public:int p_x[4]={-1,1,0,0};int p_y[4]={0,0,-1,1};int cnt=0;int find(vector<int>& Father,int x){if(Father[x]==x){return x;}Father[x]=find(Father,Father[x]);return Father[x];}void Union(vector<int>& Father,int x,int y){int Fx=find(Father,x);int Fy=find(Father,y);if(Fx==Fy){return;}Father[Fy]=Fx;cnt--;}int numIslands(vector<vector<char>>& grid) {int m=grid.size();int n=grid[0].size();vector<int> Father(m*n,0);//初始化Father数组for(int i=0;i<m;i++){for(int j=0;j<n;j++){int temp=n*i+j;if(grid[i][j]=='1'){Father[temp]=temp;cnt++;}else{Father[temp]=-1;}}}//Unionfor(int i=0;i<m;i++){for(int j=0;j<n;j++){if(grid[i][j]=='0'){continue;}for(int k=0;k<4;k++){int x=i+p_x[k];int y=j+p_y[k];if(x>=0 && x<m && y>=0 && y<n){if(grid[x][y]=='0'){continue;}else{int a=i*n+j;int b=x*n+y;Union(Father,a,b);}}}}}return cnt;}
};

Python:

 

class Solution:def find(self,Father:List[int],x:int) -> int:if Father[x]==x:return xFather[x]=self.find(Father,Father[x])return Father[x]def Union(self,Father:List[int],x:int,y:int,cnt:int) ->int:Fx=self.find(Father,x)Fy=self.find(Father,y)if Fx==Fy:return cntFather[Fy]=Fxcnt-=1return cntdef numIslands(self, grid: List[List[str]]) -> int:p_x=[-1,1,0,0]p_y=[0,0,-1,1]m=len(grid)n=len(grid[0])Father=[0]*(m*n)cnt=0for i in range(m):for j in range(n):temp=n*i+jif grid[i][j]=='1':Father[temp]=tempcnt+=1else:Father[temp]=-1for i in range(m):for j in range(n):if grid[i][j]=='0':continuefor k in range(4):x=i+p_x[k]y=j+p_y[k]if x>=0 and x<m and y>=0 and y<n:if grid[x][y]=='0':continueelse:a=i*n+jb=x*n+ycnt=self.Union(Father,a,b,cnt)return cnt

注意类中函数第一个参数为self 

http://www.khdw.cn/news/59976.html

相关文章:

  • 深圳企业网站制作哪家好吸引人的微信软文范例
  • 郑州专业做微信网站百度地图人工电话
  • 青少年编程培训教育长沙网站优化效果
  • 保真的二手手表网站谷歌推广外贸建站
  • 建设发展公司网站游戏代理0加盟费
  • 张店网站制作设计公司网络营销外包推广定制公司
  • 赛事竞猜网站开发镇江seo公司
  • wordpress插件图库关键词排名优化易下拉技巧
  • 搜索网站排名优化策略seo关键词排名查询
  • 网站优化哪家好百度模拟点击
  • 惠州网站建设制作宁德市人民医院
  • 北京企业网站备案需要多久友情链接图片
  • 宝安led行业网站建设事件营销成功案例
  • 一家专门做内部优惠的网站下载优化大师
  • 公众号版影视网站开发软文推广代理
  • 不会代码可以做网站维护吗营销策划公司排名
  • 企业网站优化怎么做重庆百度seo排名
  • 代码生成器原理湖南百度seo排名点击软件
  • 做网站需要提供什么杭州优化关键词
  • 网站建设及推广服务的合同范本千度seo
  • 网站规划设计公众号排名优化软件
  • cloud域名注册网站常用的网络推广手段有哪些
  • 上海中学官网登录百度推广优化排名怎么收费
  • 做网站需要了解的知识义乌最好的电商培训学校
  • 做网站建设多少钱seo国外英文论坛
  • 自己做网站有什么用百度竞价推广费用
  • 北京网站制作推广谷歌下载官网
  • wordpress教程安装教程视频教程合肥seo优化公司
  • 企业网站设计网络公司热搜榜上2023年热搜
  • 网站建设中英文表述北京网站seo招聘