力扣第357场周赛补题

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

思路:模拟

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)

思路:脑筋急转弯

class Solution {
public:
    bool canSplitArray(vector& 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+倒序枚举+并查集

class Solution {
public:
    int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
    typedef pair PII;
    int maximumSafenessFactor(vector>& grid) {
        int n = grid.size();
        vector q;
        vector> dist(n, vector(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> groups = {q};//groups每一层就代表的到1的距离相同的点
        //第0层就是1那些点,然后第一层就是第一层遍历的点,以此类推
        while (q.size())
        {
            vector 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 p(n * n);
        iota(p.begin(), p.end(), 0);//0,1,2,3,4...
        function 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;
    }
};

你可能感兴趣的:(补题,leetcode,算法,数据结构,c++)