【C++】leetcode 第77场双周赛

115 篇文章 3 订阅
35 篇文章 3 订阅

6051. 统计是给定字符串前缀的字符串数目

给你一个字符串数组 words 和一个字符串 s ,其中 words[i] 和 s 只包含 小写英文字母 。

请你返回 words 中是字符串 s 前缀 的 字符串数目 。

一个字符串的 前缀 是出现在字符串开头的子字符串。子字符串 是一个字符串中的连续一段字符序列。

class Solution {
public:
    int countPrefixes(vector<string>& words, string s) {
    int cnt=0;
        for(auto x:words)
        {
            if(x.size()>s.size())continue;
            int i=0;
            for(i=0;i<s.size();i++)
            {
                if(s[i]!=x[i])break;
            }
            if(i==x.size())cnt++;
        }
        return cnt;
    }
};

6052. 最小平均差

给你一个下标从 0 开始长度为 n 的整数数组 nums 。

下标 i 处的 平均差 指的是 nums 中 前 i + 1 个元素平均值和 后 n - i - 1 个元素平均值的 绝对差 。两个平均值都需要 向下取整 到最近的整数。

请你返回产生 最小平均差 的下标。如果有多个下标最小平均差相等,请你返回 最小 的一个下标。

注意:

两个数的 绝对差 是两者差的绝对值。
n 个元素的平均值是 n 个元素之 和 除以(整数除法) n 。
0 个元素的平均值视为 0 。

class Solution {
public:
    int minimumAverageDifference(vector<int>& nums) {
        vector<long long>s((int)nums.size()+10);
        for(int i=0;i<nums.size();i++)
        {
            if(i==0)s[i]=nums[i];
            else s[i]=s[i-1]+nums[i];
        }
        long long res=0x3f3f3f3f;
        int idx=0;
        for(int i=0;i<nums.size();i++)
        {
            int l=i+1,r=nums.size()-l;
            if(r)
            {
                if(res>abs(s[i]/l-(s[nums.size()-1]-s[i])/r))
                {
                    res=abs(s[i]/l-(s[nums.size()-1]-s[i])/r);
                    idx=i;
                }
            }
            else 
            {
                if(res>abs(s[i]/l-0))
                {
                    res=abs(s[i]/l-0);
                    idx=i;
                }
            }
        }
        return idx;
    }
};

6053. 统计网格图中没有被保卫的格子数

给你两个整数 m 和 n 表示一个下标从 0 开始的 m x n 网格图。同时给你两个二维整数数组 guards 和 walls ,其中 guards[i] = [rowi, coli] 且 walls[j] = [rowj, colj] ,分别表示第 i 个警卫和第 j 座墙所在的位置。

一个警卫能看到 4 个坐标轴方向(即东、南、西、北)的 所有 格子,除非他们被一座墙或者另外一个警卫 挡住 了视线。如果一个格子能被 至少 一个警卫看到,那么我们说这个格子被 保卫 了。

请你返回空格子中,有多少个格子是 没被保卫 的。

class Solution {
public:
    int countUnguarded(int m, int n, vector<vector<int>>& guards, vector<vector<int>>& walls) {
        int g[m+10][n+10];//0无保护,1有保护,2 G,3 W;
        memset(g,0,sizeof g);
        for(auto item:guards)
        {
            int x=item[0],y=item[1];
            g[x][y]=2;
        }
        for(auto item:walls)
        {
            int x=item[0],y=item[1];
            g[x][y]=3;
        }
        for(auto item:guards)
        {
            int x=item[0],y=item[1];
            for(int i=x-1;i>=0;i--)//up
            {
                if(g[i][y]==3||g[i][y]==2)break;
                if(g[i][y]==0)g[i][y]=1;
            }
            for(int i=x+1;i<m;i++)//down
            {
                if(g[i][y]==3||g[i][y]==2)break;
                if(g[i][y]==0)g[i][y]=1;
            }
            for(int i=y-1;i>=0;i--)//left
            {
                if(g[x][i]==3||g[x][i]==2)break;
                if(g[x][i]==0)g[x][i]=1;
            }
            for(int i=y+1;i<n;i++)
            {
                if(g[x][i]==3||g[x][i]==2)break;
                if(g[x][i]==0)g[x][i]=1;
            }
        }
        int res=0;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
                if(g[i][j]==0)res++;
        return res;
    }
};

6054. 逃离火灾

给你一个下标从 0 开始大小为 m x n 的二维整数数组 grid ,它表示一个网格图。每个格子为下面 3 个值之一:

0 表示草地。
1 表示着火的格子。
2 表示一座墙,你跟火都不能通过这个格子。
一开始你在最左上角的格子 (0, 0) ,你想要到达最右下角的安全屋格子 (m - 1, n - 1) 。每一分钟,你可以移动到 相邻 的草地格子。每次你移动 之后 ,着火的格子会扩散到所有不是墙的 相邻 格子。

请你返回你在初始位置可以停留的 最多 分钟数,且停留完这段时间后你还能安全到达安全屋。如果无法实现,请你返回 -1 。如果不管你在初始位置停留多久,你 总是 能到达安全屋,请你返回 109 。

注意,如果你到达安全屋后,火马上到了安全屋,这视为你能够安全到达安全屋。

如果两个格子有共同边,那么它们为 相邻 格子。

const int dx[4]={-1,0,1,0};
const int dy[4]={0,1,0,-1};
class Solution {
    bool check(vector<vector<int>>&grid,int t)
    {
        int m=grid.size(),n=grid[0].size();
        bool fire[m+10][n+10];
        memset(fire,false, sizeof fire);
        vector<pair<int,int>>f;//着火的坐标
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
                if(grid[i][j]==1)
                {
                    f.push_back({i,j});
                    fire[i][j]=true;
                }
        auto judge=[&]()
        {
            vector<pair<int,int>>backup;
            for(auto item:f)
            {
                for(int i=0;i<4;i++)
                {
                    int x=item.first+dx[i],y=item.second+dy[i];
                    if(x<0||x>=m||y<0||y>=n)continue;
                    if(fire[x][y])continue;
                    if(grid[x][y]==2)continue;
                    fire[x][y]=true;
                    backup.push_back({x,y});
                }
            }
            f=backup;
        };
        while(t--&&f.size())judge();
        if(fire[0][0])return false;
        bool st[m+10][n+10];
        memset(st,false,sizeof st);
        st[0][0]=true;
        vector<pair<int,int>>q;
        q.push_back({0,0});
        while(q.size())
        {
            vector<pair<int,int>>nq;
            for(auto t:q)
            {   
                if (!fire[t.first][t.second])
                {   
                    for(int i=0;i<4;i++)
                    {
                        int x=t.first+dx[i],y=t.second+dy[i];
                        if(x<0||x>=m||y<0||y>=n)continue;
                        if(st[x][y])continue;
                        if(fire[x][y])continue;
                        if(grid[x][y]==2)continue;
                        if(x==m-1&&y==n-1)return true;
                        st[x][y]=true;
                        nq.push_back({x,y});
                    }
                }
            }
            q=nq;
            judge();
        }
        return false;
    }
public:
    int maximumMinutes(vector<vector<int>>& grid) {
        int m=grid.size(),n=grid[0].size();
        int l=-1,r=m*n;
        while(l<r)
        {
            int mid=l+r+1>>1;
            if(check(grid,mid))l=mid;
            else r=mid-1;
        }
        return l<m*n?l:1e9;
    }
};
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leimingzeOuO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值