365天挑战LeetCode1000题——Day 087 特殊数组的特征值 颜色交替的最短路径 重新规划路线 访问所有节点的最短路径

这篇博客包含四个代码实现,分别解决特殊数组的特征值问题、颜色交替的最短路径、重新规划路线以及访问所有节点的最短路径。通过排序、队列、图遍历等算法,找到最优解并返回结果。

1608. 特殊数组的特征值

在这里插入图片描述

代码实现(自解)

class Solution {
public:
    int specialArray(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int n = nums.size();
        if (nums[0] >= n) return n;
        for (int i = 0; i < n - 1; i++) {
            if (nums[i] < n - i - 1 && nums[i + 1] >= n - i - 1) return n  - i - 1;
        }
        if (nums[n - 1] < 0) return 0;
        return -1;
    }
};

1129. 颜色交替的最短路径

在这里插入图片描述

代码实现(自解)

class Solution {
public:
    vector<int> shortestAlternatingPaths(int n, vector<vector<int>>& redEdges, vector<vector<int>>& blueEdges) {
        vector<int> ans(n, -1);
        ans[0] = 0;
        map<int, vector<int>> red;
        map<int, vector<int>> blue;
        for (const auto& arr : redEdges) {
            red[arr[0]].push_back(arr[1]);
        }
        for (const auto& arr : blueEdges) {
            blue[arr[0]].push_back(arr[1]);
        }
        set<pair<int, bool>> mySet;
        queue<pair<int, bool>> myQueue;
        for (auto i : red[0]) {
            myQueue.push(make_pair(i, true));
            mySet.emplace(make_pair(i, true));
        }
        for (auto i : blue[0]) {
            myQueue.push(make_pair(i, false));
            mySet.emplace(make_pair(i, false));
        }
        int len = 1;
        while (!myQueue.empty()) {
            int sz = myQueue.size();
            while (sz--) {
                auto [to, isRed] = myQueue.front();
                myQueue.pop();
                if (ans[to] == -1) {
                    ans[to] = len;
                }
                vector<int> nextNodes;
                if (isRed) nextNodes = blue[to];
                else nextNodes = red[to];
                for (auto nex : nextNodes) {
                    if (!mySet.count(make_pair(nex, !isRed))) {
                        mySet.emplace(make_pair(nex, !isRed));
                        myQueue.push(make_pair(nex, !isRed));
                    }
                }
            }
            len++;
        }
        return ans;
    }
};

1466. 重新规划路线

在这里插入图片描述

代码实现(看题解)

class Solution {
public:
    int minReorder(int n, vector<vector<int>>& connections) {
        vector<vector<int>> conn_idx(n, vector<int>());
        for (int i = 0; i < connections.size(); i++) {
            conn_idx[connections[i][0]].push_back(i);
            conn_idx[connections[i][1]].push_back(i);
        }

        vector<bool> vi(connections.size(), false);
        int ans = 0;
        queue<int> que;
        que.push(0);

        while (!que.empty()) {
            auto q = que.front();
            que.pop();

            for (auto idx : conn_idx[q]) {
                if (vi[idx]) continue;
                vi[idx] = true;

                int a = connections[idx][0];
                int b = connections[idx][1];
                ans += (a == q);
                a = (a == q) ? b : a;
                que.push(a);
            }
        }
        return ans;
    }
};

847. 访问所有节点的最短路径

在这里插入图片描述

代码实现(部分看题解)

class Solution {
public:
    int shortestPathLength(vector<vector<int>>& graph) {
        int n = graph.size();
        if (n == 1) return 0;
        queue<pair<int, int>> myQueue;
        for (int i = 0; i < n; i++) {
            myQueue.push({i, 1 << i});
        }
        int len = 0;
        set<pair<int, int>> visited;
        while (!myQueue.empty()) {
            int sz = myQueue.size();
            while (sz--) {
                auto [i, mask] = myQueue.front();
                myQueue.pop();
                if (mask == (1 << n) - 1) {
                    return len;
                }
                if (visited.count(make_pair(i,mask))) continue;
                visited.emplace(make_pair(i,mask));
                for (auto j : graph[i]) {
                    int tmp = mask | (1 << j);
                    myQueue.push({j, tmp});
                }
            }
            len++;
        }
        return -1;
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值