第 357 场周赛 - 力扣

第 357 场周赛 - 力扣(LeetCode)

2810. 故障键盘 - 力扣(LeetCode)

如题模拟即可

class Solution {
public:
    string finalString(string s) {

        string ans = "";
        for(int i = 0;i < s.size(); i++){
            if(s[i] == 'i'){
                std::reverse(ans.begin(), ans.end());
            }else
                ans += s[i];
        }
        return ans;
    }
};

2811. 判断是否能拆分数组 - 力扣(LeetCode)

\(n\le2\)时总是能满足要求,\(n>3\)时,只要其中有一对相邻数大于等于\(m\),我们都可以一个一个地去掉除这两元素之外的其他元素,最后剩这两元素也满足条件

class Solution {
public:
    bool canSplitArray(vector<int>& nums, int m) {
        int n = nums.size();
        if(n <= 2) return true;
        
        for(int i = 1;i < n;i ++)
            if(nums[i] + nums[i - 1] >= m)
                return true;
        
        return false;
    }
};

2812. 找出最安全路径 - 力扣(LeetCode)(多源BFS最短路)

如果直接去找路径,那么每个点都要去计算一遍,这样在当数据大时很容易超时,所以我们可以先去预处理出每个单元格的安全系数,然后从中选出一条安全系数最大的路径即可,这样就大大降低了时间复杂度.

由于本题一个是矩阵图,所以可以用\(BFS\)计算各个单元安全系数

然后我们从\((0,0)\)开始,将每次访问顶点的四周可访问点都按\(\{安全系数,坐标\}\)存入优先队列,然后每次去选取当前路径安全系数最优的点,答案也要随着更新最小的安全系数,最后到达\((n-1,n-1)\)时返回\(ans\)即可

class Solution {
public:
    int maximumSafenessFactor(vector<vector<int>>& grid) {
        typedef pair<int,int> PII;

        int n = grid.size();
        int u[] = {1,-1,0,0};
        int v[] = {0,0,1,-1};
        queue<PII> Q;
        vector dis(n,vector<int>(n,-1));
        for (int i = 0;i < n;i ++)
            for (int j = 0; j < n; ++j)
                if(grid[i][j]){
                    Q.emplace(i,j);
                    dis[i][j] = 0;
                }

        vector vis(n,vector<bool>(n,false));
        while(Q.size()){
            auto [x,y] = Q.front();
            Q.pop();

            for(int i = 0;i < 4;i ++){
                int dx = x + u[i];
                int dy = y + v[i];
                if(dx >= 0 && dy >= 0 && dx < n && dy < n && dis[dx][dy] < 0){
                	Q.emplace(dx,dy);
                	dis[dx][dy] = dis[x][y] + 1;
                }
            }
        }

        priority_queue<pair<int,PII>> QQ;
        QQ.push({dis[0][0],{0,0}});
        vis[0][0] = true;
        int ans = n << 1;
        while(QQ.size()){
            auto [w,xy] = QQ.top();
            QQ.pop();

            auto [x,y] = xy;
            ans = min(w,ans);
           
            if(x == n - 1 && y == n - 1) return ans;

            for(int i = 0;i < 4;i ++){
                int dx = x + u[i];
                int dy = y + v[i];
                if(dx >= 0 && dy >= 0 && dx < n && dy < n && !vis[dx][dy]){
                    QQ.push({dis[dx][dy],{dx,dy}});
                    vis[dx][dy] = true;
                }
            }
        }

        return 0;
    }
};
posted @ 2023-08-08 22:51  Ke_scholar  阅读(20)  评论(0编辑  收藏  举报