力扣第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;
    }
};
相关推荐
_wyt0017 小时前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp
通信小呆呆9 小时前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
benben0449 小时前
强化学习之DQN算法族(基于gymnasium开发)
算法
小小工匠10 小时前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾10 小时前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
何以解忧,唯有..10 小时前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
想吃火锅100511 小时前
【leetcode】88.合并两个有序数组js
算法
один but you11 小时前
constexpr函数
c++
生成论实验室12 小时前
机器人:一个自主运动的系统
人工智能·算法·语言模型·机器人·自动驾驶·agi·安全架构