力扣第357场周赛补题

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

思路:模拟

cpp 复制代码
class Solution {
public:
    string finalString(string s) {
        string res;
        for(auto c : s)
        {
            if(c == 'i') reverse(res.begin(), res.end());
            else res += c;
        }
        
        return res;
    }
};

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

思路:脑筋急转弯

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

2812. 找出最安全路径 - 力扣(LeetCode)

思路:多源bfs+倒序枚举+并查集

cpp 复制代码
class Solution {
public:
    int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
    typedef pair<int, int> PII;
    int maximumSafenessFactor(vector<vector<int>>& grid) {
        int n = grid.size();
        vector<PII> q;
        vector<vector<int>> dist(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_back(i, j);
                    dist[i][j] = 0;
                }
        vector<vector<PII>> groups = {q};//groups每一层就代表的到1的距离相同的点
        //第0层就是1那些点,然后第一层就是第一层遍历的点,以此类推
        while (q.size())
        {
            vector<PII> nq;
            for(auto &[i, j] : q)
            {
                for (int k = 0; k < 4; k ++ ) 
                {
                    int x = i + dx[k], y = j + dy[k];
                    if(x >= 0 && x < n && y >= 0 && y < n && dist[x][y] < 0)
                    {
                        nq.emplace_back(x, y);
                        dist[x][y] = groups.size();
                    }
                }
            }
            groups.push_back(nq);
            q = move(nq);//move将nq强制转化为右值引用
        }
        //并查集
        vector<int> p(n * n);
        iota(p.begin(), p.end(), 0);//0,1,2,3,4...
        function<int(int)> find = [&](int x) -> int {
            if(p[x] != x) return p[x] = find(p[x]); 
            return p[x];
        };
        //因为最后还加了一层空数组,所以减2
        for(int res = groups.size() - 2; res > 0; res -- )
        {
            for(auto &[i, j] : groups[res])
            {
                for (int k = 0; k < 4; k ++ ) 
                {
                    int x = i + dx[k], y = j + dy[k];
                    if(x >= 0 && x < n && y >= 0 && y < n && dist[x][y] >= dist[i][j])
                        p[find(x * n + y)] = find(i * n + j);
                }
            }
            if(find(0) == find(n * n - 1)) return res;
        }
        return 0;
    }
};
相关推荐
这儿有一堆花7 分钟前
C语言递归宏详解
c语言·开发语言·c++
郝学胜-神的一滴15 分钟前
计算机图形中的法线矩阵:深入理解与应用
开发语言·程序人生·线性代数·算法·机器学习·矩阵·个人开发
ue星空32 分钟前
全局描述符表GDT (Global Descriptor Table)
c++
m0_5913389134 分钟前
day8鹏哥C语言--函数
c语言·开发语言·算法
_OP_CHEN37 分钟前
算法基础篇:(二)基础算法之高精度:突破数据极限
算法·acm·算法竞赛·高精度算法·oj题
一只老丸40 分钟前
HOT100题打卡第30天——技巧
算法
西岭千秋雪_44 分钟前
Zookeeper数据结构
java·数据结构·分布式·zookeeper
Bi_BIT1 小时前
代码随想录训练营打卡Day38| 动态规划part06
算法·动态规划
oioihoii1 小时前
C++中的多态:动态多态与静态多态详解
java·开发语言·c++
手握风云-1 小时前
回溯剪枝的“减法艺术”:化解超时危机的 “救命稻草”(三)
算法·剪枝