本篇参照大佬博客练习题顺序,代码都是自打的,有些可能不是最优解。
目录
1091. 二进制矩阵中的最短路径
class Solution {
public:
struct node{
int x;
int y;
int s;
};
int shortestPathBinaryMatrix(vector<vector<int>>& grid) {
queue<node>q;
vector<int>x;
if(grid.size()==0)
return 0;
for(int j=0;j<grid[0].size();j++)
{
x.push_back(0);
}
vector<vector<int>>vis;
for(int i=0;i<grid.size();i++)
vis.push_back(x);
if(grid[0][0]==1)
return -1;
q.push({0,0,1});
vis[0][0]=1;
int ans=0;
int dx[8][2]={{0,1},{1,0},{-1,0},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
while(!q.empty())
{
node p=q.front();
q.pop();
if(p.x==grid.size()-1&&p.y==grid[0].size()-1)
return p.s;
for(int i=0;i<8;i++)
{
int xx=p.x+dx[i][0];
int yy=p.y+dx[i][1];
if(xx>=0&&xx<grid.size()&&yy>=0&&yy<grid[0].size()&&vis[xx][yy]==0&&grid[xx][yy]==0)
{
vis[xx][yy]=1;
q.push({xx,yy,p.s+1});
}
}
}
return -1;
}
};
279. 完全平方数
class Solution {
public:
int numSquares(int n) {
int b=n;
while(n%4==0)
{
n/=4;
}
if(n%8==7)
return 4;
n=b;
b=sqrt(n);
if(b*b==n)
return 1;
for(int i=1;i*i<=n;i++)
{
int j=sqrt(n-i*i);
if(j*j+i*i==n)
return 2;
}
return 3;
}
};
127. 单词接龙
class Solution {
public:
struct node{
string p;
int s;
};
int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
queue<node>q;
q.push({beginWord,1});
vector<int>vis;
for(int i=0;i<wordList.size();i++)
{
vis.push_back(0);
if(wordList[i]==beginWord)
vis[i]=1;
}
while(!q.empty())
{
node x=q.front();
q.pop();
if(x.p==endWord)
return x.s;
for(int i=0;i<wordList.size();i++)
{
int ss=0;
for(int j=0;j<x.p.size();j++)
{
if(x.p[j]!=wordList[i][j])
ss++;
}
if(ss==1&&vis[i]==0)
{
vis[i]=1;
q.push({wordList[i],x.s+1});
}
}
}
return 0;
}
};
695. 岛屿的最大面积
class Solution {
public:
vector<vector<int>>a,vis;
int max1,s,n,m;
void dfs(int i,int j)
{
if(i+1<n&&a[i+1][j]==1&&vis[i+1][j]==0)
{
vis[i+1][j]=1;
s++;
dfs(i+1,j);
}
if(j+1<m&&a[i][j+1]==1&&vis[i][j+1]==0)
{
vis[i][j+1]=1;
s++;
dfs(i,j+1);
}
if(i-1>=0&&a[i-1][j]==1&&vis[i-1][j]==0)
{
vis[i-1][j]=1;
s++;
dfs(i-1,j);
}
if(j-1>=0&&a[i][j-1]==1&&vis[i][j-1]==0)
{
vis[i][j-1]=1;
s++;
dfs(i,j-1);
}
}
int maxAreaOfIsland(vector<vector<int>>& grid) {
a=grid;
n=grid.size();
m=grid[0].size();
vector<int>x;
for(int i=0;i<m;i++)
{
x.push_back(0);
}
for(int i=0;i<n;i++)
{
vis.push_back(x);
}
max1=0,s=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(grid[i][j]==1)
{
vis[i][j]=1;
s=1;
dfs(i,j);
max1=max(max1,s);
}
}
}
return max1;
}
};
200. 岛屿数量
class Solution {
public:
vector<vector<char>>a;
vector<vector<int>>vis;
int max1,s,n,m;
void dfs(int i,int j)
{
if(i+1<n&&a[i+1][j]=='1'&&vis[i+1][j]==0)
{
vis[i+1][j]=1;
s++;
dfs(i+1,j);
}
if(j+1<m&&a[i][j+1]=='1'&&vis[i][j+1]==0)
{
vis[i][j+1]=1;
s++;
dfs(i,j+1);
}
if(i-1>=0&&a[i-1][j]=='1'&&vis[i-1][j]==0)
{
vis[i-1][j]=1;
s++;
dfs(i-1,j);
}
if(j-1>=0&&a[i][j-1]=='1'&&vis[i][j-1]==0)
{
vis[i][j-1]=1;
s++;
dfs(i,j-1);
}
}
int numIslands(vector<vector<char>>& grid) {
a=grid;
n=grid.size();
m=grid[0].size();
vector<int>x;
for(int i=0;i<m;i++)
{
x.push_back(0);
}
for(int i=0;i<n;i++)
{
vis.push_back(x);
}
max1=0,s=0;
int t=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(grid[i][j]=='1'&&vis[i][j]==0)
{
vis[i][j]=1;
s=1;
t++;
dfs(i,j);
max1=max(max1,s);
}
}
}
return t;
}
};
17. 电话号码的字母组合
class Solution {
public:
vector<char>x[10];
vector<string>ans;
void dfs(string s,int i,string t)
{
if(i>=s.size())
{
if(t.size()!=0)
ans.push_back(t);
return;
}
for(int j=0;j<x[s[i]-'0'].size();j++)
{
string p=t+x[s[i]-'0'][j];
dfs(s,i+1,p);
}
}
vector<string> letterCombinations(string digits) {
x[2].push_back('a');
x[2].push_back('b');
x[2].push_back('c');
x[3].push_back('d');
x[3].push_back('e');
x[3].push_back('f');
x[4].push_back('g');
x[4].push_back('h');
x[4].push_back('i');
x[5].push_back('j');
x[5].push_back('k');
x[5].push_back('l');
x[6].push_back('m');
x[6].push_back('n');
x[6].push_back('o');
x[7].push_back('p');
x[7].push_back('q');
x[7].push_back('r');
x[7].push_back('s');
x[8].push_back('t');
x[8].push_back('u');
x[8].push_back('v');
x[9].push_back('w');
x[9].push_back('x');
x[9].push_back('y');
x[9].push_back('z');
dfs(digits,0,"");
return ans;
}
};
79. 单词搜索
class Solution {
public:
vector<vector<char>>x;
vector<vector<int>>vis;
string y;
int flag=0,n,m;
void dfs(int i,int j,int k)
{
if(flag)
return ;
if(k==y.size()-1)
{
flag=1;
return ;
}
if(i>0)
{
if(vis[i-1][j]==0&&x[i-1][j]==y[k+1])
{
vis[i-1][j]=1;
dfs(i-1,j,k+1);
vis[i-1][j]=0;
}
}
if(i<n-1)
{
if(vis[i+1][j]==0&&x[i+1][j]==y[k+1])
{
vis[i+1][j]=1;
dfs(i+1,j,k+1);
vis[i+1][j]=0;
}
}
if(j>0)
{
if(vis[i][j-1]==0&&x[i][j-1]==y[k+1])
{
vis[i][j-1]=1;
dfs(i,j-1,k+1);
vis[i][j-1]=0;
}
}
if(j<m-1)
{
if(vis[i][j+1]==0&&x[i][j+1]==y[k+1])
{
vis[i][j+1]=1;
dfs(i,j+1,k+1);
vis[i][j+1]=0;
}
}
}
bool exist(vector<vector<char>>& board, string word) {
x=board;
y=word;
n=board.size();
m=board[0].size();
vector<int>q;
for(int j=0;j<board[0].size();j++)
{
q.push_back(0);
}
for(int j=0;j<board.size();j++)
{
vis.push_back(q);
}
for(int i=0;i<board.size();i++)
{
for(int j=0;j<board[i].size();j++)
{
if(board[i][j]==word[0])
{
vis[i][j]=1;
dfs(i,j,0);
vis[i][j]=0;
if(flag)
break;
}
}
if(flag)
break;
}
if(flag)
return true;
else
return false;
}
};