Problem: 1334. 阈值距离内邻居最少的城市
思路
这道题要求找到在给定的阈值距离内,具有最少邻居城市数量的城市。我们可以使用Floyd算法来解决这个问题。
解题方法
- 首先,我们需要创建一个二维数组mp,用于表示城市之间的距离。我们将所有城市之间的距离初始化为一个较大的值(这里使用
Integer.MAX_VALUE / 2
)。 - 然后,我们遍历给定的边,将边的起点、终点和权重分别存储在
from
、to
和weight
变量中。我们将mp[from][to]
和mp[to][from]
的值设置为weight
,表示城市from
和城市to
之间的距离为weight
。 - 接下来,我们使用Floyd算法来计算任意两个城市之间的最短距离。我们遍历所有的中间节点k,并更新mp[i][j]的值为mp[i][k] + mp[k][j]的较小值。这样,我们就可以得到任意两个城市之间的最短距离。
- 然后,我们遍历所有的城市,计算每个城市在给定的阈值距离内能够到达的城市数量。我们使用变量
cnt
来记录满足条件的城市数量。如果mp[i][j]
小于等于阈值距离distanceThreshold
,则将cnt
加一。 - 最后,我们比较每个城市的邻居数量
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];
}
}