力扣第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;
    }
};
相关推荐
憧憬成为原神糕手2 分钟前
c++_list
开发语言·c++
zyh200504304 分钟前
c++的decltype关键字
c++·decltype
眰恦37412 分钟前
数据结构--第六章图
数据结构·算法
2401_8628867822 分钟前
蓝禾,汤臣倍健,三七互娱,得物,顺丰,快手,游卡,oppo,康冠科技,途游游戏,埃科光电25秋招内推
前端·c++·python·算法·游戏
luthane24 分钟前
python 实现armstrong numbers阿姆斯壮数算法
python·算法
楠枬26 分钟前
双指针算法
java·算法·leetcode
sjsjs1129 分钟前
【数据结构-差分】力扣1589. 所有排列中的最大和
数据结构·算法·leetcode
独領风萧30 分钟前
数据结构之二叉树(1)
数据结构
小川_wenxun1 小时前
优先级队列(堆)
java·开发语言·算法