【leetcode】图---中等(1)1267. 统计参与通信的服务器_矩阵图_两次遍历(2)1306. 跳跃游戏 III_一维数组_dfs(3)*1334. 阈值距离内邻居最少的城市_多源最短路径

这篇博客探讨了LeetCode中的三个题目,涉及图的通信服务器统计、跳跃游戏III和阈值距离内的城市问题。作者介绍了如何使用Floyd算法解决多源最短路径问题,并分享了C++实现的代码和执行效率。
摘要由CSDN通过智能技术生成

1267、这里有一幅服务器分布图,服务器的位置标识在 m * n 的整数矩阵网格 grid 中,1 表示单元格上有服务器,0 表示没有。

如果两台服务器位于同一行或者同一列,我们就认为它们之间可以进行通信。

请你统计并返回能够与至少一台其他服务器进行通信的服务器的数量。

示例 3:

输入:grid = [[1,1,0,0],[0,0,1,0],[0,0,1,0],[0,0,0,1]]
输出:4
解释:第一行的两台服务器互相通信,第三列的两台服务器互相通信,但右下角的服务器无法与其他服务器通信。

 矩阵图,对每一个点遍历。遇见1,则对其行列进行检查。

  1. 当该点行列都已经被标记,无需多余操作,continue
  2. 当该点,行未被标记,对该i行j+1列--n列,遍历check是否有1,若有1,则flag=true,证明该点通路。判断该1是否已经被遍历到,即判断该1所属行mark_m[a]是否为T
  3. 当该点,列未被标记,对该j列i+1行--m行,遍历check是否有1,若有1,则flag=true,证明该点通路。判断该1是否已经被遍历到,即判断该1所属行mark_n[b]是否为T

讨论较为复杂,提交好几次失败,寻找原因才AC。


class Solution{
public:
    int countServers(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size();    // m行n列
        int ans = 0, tmp = 0, cnt = 0;
        vector<bool> mark_m(m, false);
        vector<bool> mark_n(n, false);
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++){
                if(grid[i][j] ){ //找到一个1,检查其所属行列
                    if(mark_m[i] && mark_n[j]) continue;
                    bool flag = false;
                    if(!mark_m[i]) {
                        cnt++; 
                        for(int b = j + 1; b < n; b++) 
                            if(grid[i][b]) {flag = true; if(!mark_n[b]) tmp++; }
                    }
                    if(!mark_n[j]) {
                        cnt++;
                        for(int a = i + 1; a < m; a++) 
                            if(grid[a][j]) 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值