力扣训练——搜索

这篇博客主要记录了作者在力扣平台上的搜索题目训练,包括二进制矩阵中最短路径、完全平方数、单词接龙、岛屿的最大面积、岛屿数量、电话号码的字母组合和单词搜索等题目的个人解答,所有代码均为原创,部分可能非最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇参照大佬博客练习题顺序,代码都是自打的,有些可能不是最优解。

目录

1091. 二进制矩阵中的最短路径

279. 完全平方数

127. 单词接龙

695. 岛屿的最大面积

200. 岛屿数量

17. 电话号码的字母组合

79. 单词搜索


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;
    }
};

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值