力扣打卡 1334-阈值距离内邻居最少的城市

Problem: 1334. 阈值距离内邻居最少的城市

思路

这道题要求找到在给定的阈值距离内,具有最少邻居城市数量的城市。我们可以使用Floyd算法来解决这个问题。

解题方法

  1. 首先,我们需要创建一个二维数组mp,用于表示城市之间的距离。我们将所有城市之间的距离初始化为一个较大的值(这里使用Integer.MAX_VALUE / 2)。
  2. 然后,我们遍历给定的边,将边的起点、终点和权重分别存储在fromtoweight变量中。我们将mp[from][to]mp[to][from]的值设置为weight,表示城市from和城市to之间的距离为weight
  3. 接下来,我们使用Floyd算法来计算任意两个城市之间的最短距离。我们遍历所有的中间节点k,并更新mp[i][j]的值为mp[i][k] + mp[k][j]的较小值。这样,我们就可以得到任意两个城市之间的最短距离
  4. 然后,我们遍历所有的城市,计算每个城市在给定的阈值距离内能够到达的城市数量。我们使用变量cnt来记录满足条件的城市数量。如果mp[i][j]小于等于阈值距离distanceThreshold,则将cnt加一。
  5. 最后,我们比较每个城市的邻居数量cnt,并更新最小邻居数量和对应的城市索引。最后,返回具有最少邻居数量的城市索引。

复杂度

  • 时间复杂度:
    O ( n 3 ) O(n^3) O(n3)
    n是城市的数量,Floyd算法有三层遍历

  • 空间复杂度:
    O ( n 2 ) O(n^2) O(n2)
    需要用二维数组mp来存储城市之间的距离

Code

class Solution {
    public int findTheCity(int n, int[][] edges, int distanceThreshold) {
        //搜索当前点在限定路径长度下能够到达的城市
        //永远走短的边,floyd算法
        int[] ans = {Integer.MAX_VALUE, 0};
        int[][] mp = new int [n][n];
        for(int i = 0 ;i < n ;++i){
            Arrays.fill(mp[i],Integer.MAX_VALUE / 2);
        }
        for(int[] eg:edges){
            //取出边的起点终点和权值,都存储起来。
            int from = eg[0], to = eg[1],weight = eg[2];
            mp[from][to] = mp[to][from] = weight;
        }
        //接下来是Floyd算法处理mp数组,跑完下面这个循环后mp中存放的值都是i到j的最短距离
        for(int k = 0; k < n; k++){
            mp[k][k] = 0;
            for(int i = 0; i < n; ++i){
                for(int j = 0; j < n; ++j){
                    //状态转移
                    mp[i][j] = Math.min(mp[i][j],mp[i][k] + mp[k][j]);
                }
            }
        }
        //遍历mp,找出在阈值下邻居最少的节点
        for(int i = 0; i < n; ++i){
            int cnt = 0;
            for(int j = 0; j < n; ++j){
                if(mp[i][j] <= distanceThreshold){
                    cnt++;
                }
            }
            //一开始ans[0]是个巨大的数字,这里会一直在最早确定最少邻居的节点
            if(cnt <= ans[0]){
                ans[0] = cnt;
                //索引
                ans[1] = i;
            }
        }
        //返回索引
        return ans[1];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值