797.すべての可能なパス
分析: 0~n-1 のすべての可能なパス
アイデア 1: バックトラッキング
- 中間配列 Mid を使用し、開始位置 0 を追加して、2 次元配列を反復処理します。
- 1 つの次元に移動する場合、次の再帰ラウンドは、現在の値の添字で表される配列に直接ジャンプします。
- 終了条件: Mid の終了値が n-1 の場合、または走査された配列インデックスが n に等しい場合
class Solution {
public:
vector<vector<int>>res;
vector<int>mid={0};
void backtrace(vector<vector<int>>&graph,int starti,int n){
if(mid.back()==n-1){//遍历到一条路径时
res.push_back(mid);
return;
}
if(starti==n) return;//超出二维下标
for(int i=0;i<graph[starti].size();i++){
mid.push_back(graph[starti][i]);
backtrace(graph,graph[starti][i],n);
mid.pop_back();//回溯
}
}
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
int n=graph.size();
backtrace(graph,0,n);
return res;
}
};
200.島の数
アイデア 1: 深さ優先トラバーサル
- 1. すべての場所を横断する
- 2. 訪問されていない島を横断する場合、res がインクリメントされ、その 4 方向で深さ優先の横断が実行されます。
class Solution {
public:
int direct[4][2]={
{0,1},{0,-1},{-1,0},{1,0}};
void dfs(vector<vector<char>>&grid,vector<vector<bool>>&visted,int x,int y){
for(int i=0;i<4;i++){//从四个方向进行深度优先搜索
int nextx = x+direct[i][0];
int nexty = y+direct[i][1];
if(nextx<grid.size() && nextx>=0 && nexty<grid[0].size() && nexty>=0){//当未越界时
if(grid[nextx][nexty]=='1' && !visted[nextx][nexty]){//当前陆地没有被遍历过时
visted[nextx][nexty]=true;
dfs(grid,visted,nextx,nexty);
}
}
}
}
int numIslands(vector<vector<char>>& grid) {
int n=grid.size(),m=grid[0].size();
int res=0;
vector<vector<bool>>visted(n,vector<bool>(m,false));
for(int i=0;i<n;i++){//对所有位置进行遍历
for(int j=0;j<m;j++){
if(grid[i][j]=='1' && !visted[i][j]){//当前陆地没有被遍历过时
visted[i][j]=true;
res++;
dfs(grid,visted,i,j);//遍历连接的陆地
}
}
}
return res;
}
};
アイデア 2: 幅優先のトラバーサル
- 1. 最初にすべての場所を横断する
- 2. まだ横断していない土地に遭遇すると、res がインクリメントされ、幅優先の横断に入ります。
- 3. 幅優先走査: 走査した座標をマークした後、それらの座標をスタックに直接入れ、スタック内のレイヤごとに走査します。
class Solution {
public:
int direct[4][2]={
{0,1},{0,-1},{-1,0},{1,0}};
void bfs(vector<vector<char>>&grid,vector<vector<bool>>&visted,int x,int y){
queue<pair<int,int>>que;
que.push(make_pair(x,y));
visted[x][y]=true;//加入栈就是已经遍历
while(!que.empty()){
pair<int,int> cur=que.front();//获取栈顶组合
que.pop();
int curx=cur.first;
int cury=cur.second;
for(int i=0;i<4;i++){//从四个方向的第一层进行遍历
int nextx=curx+direct[i][0];
int nexty=cury+direct[i][1];
//防止越界
if(nextx>=0 && nextx<grid.size() && nexty>=0 && nexty<grid[0].size()){
if(grid[nextx][nexty]=='1' && !visted[nextx][nexty]){
que.push(make_pair(nextx,nexty));//放入当前层,下次遍历下一层
visted[nextx][nexty]=true;
}
}
}
}
}
int numIslands(vector<vector<char>>& grid) {
int n=grid.size(),m=grid[0].size();
int res=0;
vector<vector<bool>>visted(n,vector<bool>(m,false));
for(int i=0;i<n;i++){//对所有位置进行遍历
for(int j=0;j<m;j++){
if(grid[i][j]=='1' && !visted[i][j]){//当前陆地没有被遍历过时
visted[i][j]=true;
res++;
bfs(grid,visted,i,j);//遍历连接的陆地
}
}
}
return res;
}
};
695.島の最大面積
アイデア 1: 幅優先検索
- 1. すべての場所を横断する
- 2. 現在位置が陸地でまだ横断していない場合は、幅優先横断に入ります。
- 3. 幅優先のトラバース: 新しい土地をトラバースするたびに、mid が増分され、最終的に Mid が返されます。
- 4. 中間までの最大面積を更新します
class Solution {
public:
int direct[4][2]={
{0,1},{0,-1},{-1,0},{1,0}};
int bfs(vector<vector<int>>&grid,vector<vector<bool>>&visted,int x,int y){
queue<pair<int,int>>que;
que.push(make_pair(x,y));
visted[x][y]=true;
int mid=1;//初始只有一个岛屿
while(!que.empty()){
pair<int,int>cur=que.front();
que.pop();
int curx=cur.first;
int cury=cur.second;
for(int i=0;i<4;i++){
int nextx=curx+direct[i][0];
int nexty=cury+direct[i][1];
if(nextx>=0 && nextx<grid.size() && nexty>=0 && nexty<grid[0].size()){
if(!visted[nextx][nexty] && grid[nextx][nexty]==1){
mid++;//遍历到新的陆地面积自增
que.push(make_pair(nextx,nexty));
visted[nextx][nexty]=true;
}
}
}
}
return mid;
}
int maxAreaOfIsland(vector<vector<int>>& grid) {
int n=grid.size(),m=grid[0].size();
vector<vector<bool>>visted(n,vector<bool>(m,false));
int res=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(!visted[i][j] && grid[i][j]==1){
int mid=bfs(grid,visted,i,j);//获取当前岛屿面积
if(mid>res) res=mid;//更新最大面积
}
}
}
return res;
}
};
アイデア 2: 深さ優先トラバーサル
- 1. すべての要素を横断する
- 2. 新しい土地を横断するときは、まずその土地を訪問済みとしてマークし、次に深さ優先の横断を開始します。
- 3. 4 方向に移動し、新しい土地に到達するとカウントが増加します。
- 4. 深さ優先探索が終了したら、最大領域を更新します(更新後のカウント値は 1 になります)。
class Solution {
public:
int direct[4][2]={
{0,1},{0,-1},{-1,0},{1,0}};
int res=0;
int mid=1;
void dfs(vector<vector<int>>&grid,vector<vector<bool>>&visted,int x,int y){
for(int i=0;i<4;i++){
int nextx=x+direct[i][0];
int nexty=y+direct[i][1];
//越界控制
if(nextx>=0 && nextx<grid.size() && nexty>=0 && nexty<grid[0].size()){
if(!visted[nextx][nexty] && grid[nextx][nexty]==1){//遍历到新的陆地时
visted[nextx][nexty]=true;
mid++;//面积自增
dfs(grid,visted,nextx,nexty);//进入深度优先搜索
}
}
}
}
int maxAreaOfIsland(vector<vector<int>>& grid) {
int n=grid.size(),m=grid[0].size();
vector<vector<bool>>visted(n,vector<bool>(m,false));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(!visted[i][j] && grid[i][j]==1){
visted[i][j]=true;
dfs(grid,visted,i,j);//进入深度优先搜索
if(mid>res) res=mid;
mid=1;//记录面积值重新赋值
}
}
}
return res;
}
};