Leetcode 刷题经历 Leetcode 1334 阈值距离内邻居最少的城市

有 n 个城市,按从 0 到 n-1 编号。给你一个边数组 edges,其中 edges[i] = [fromi, toi, weighti] 代表 fromi 和 toi 两个城市之间的双向加权边,距离阈值是一个整数 distanceThreshold。

返回能通过某些路径到达其他城市数目最少、且路径距离 最大 为 distanceThreshold 的城市。如果有多个这样的城市,则返回编号最大的城市。

注意,连接城市 i 和 j 的路径的距离等于沿该路径的所有边的权重之和。

示例 1:

输入:n = 4, edges = [[0,1,3],[1,2,1],[1,3,4],[2,3,1]], distanceThreshold = 4
输出:3

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-the-city-with-the-smallest-number-of-neighbors-at-a-threshold-distance
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答:其实就是Floyd算法嘛
好像Dijskra时间上能差一些?

了解下auto属性
一般人使用auto的时候是出于以下目的:
为了避免太长的类型描述影响代码可读性,用auto。
但我觉得这不是正确的理由,或者说这并没有说到点子上。从可读性的角度来说,我个人遵循的是这样的原则:
如果这个东西(类型)并不应该是读者关心的重点,则用auto。
实际上就是一个自动找变量的过程……避免出现

vector<int> v;

vector<int>::iterator iter = v.begin();

auto I = v.begin();
/*第二种写法就比第一种写法方便超级多*/

代码:

class Solution {
public:
    int findTheCity(int n, vector<vector<int>>& edges, int distanceThreshold) {
    	// 定义二维D向量,并初始化各个城市间距离为INT_MAX(无穷)
        vector<vector<int>> D(n, vector<int>(n, INT_MAX));
        // 根据edges[][]初始化D[][]
        for (auto& e : edges) {
        // 无向图两个城市间的两个方向距离相同
        	D[e[0]][e[1]] = e[2];
        	D[e[1]][e[0]] = e[2];
        }
        // Floyd算法
        for (int k = 0; k < n; k++) {
        // n个顶点依次作为插入点
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < n; j++) {
					if (i == j || D[i][k] == INT_MAX || D[k][j] == INT_MAX) {
					// 这些情况都不符合下一行的if条件,
					// 单独拿出来只是为了防止两个INT_MAX相加导致溢出
						continue;
					}
					D[i][j] = min(D[i][k]+D[k][j], D[i][j]);
				}
			}
		}
        // 选择出能到达其它城市最少的城市ret
        int ret;
        int minNum = INT_MAX;
        for (int i = 0; i < n; i++) {
        	int cnt = 0; 
        	for (int j = 0; j < n; j++) {
        		if (i != j && D[i][j] <= distanceThreshold) {
        			cnt++;
        		}
        	}
        	if (cnt <= minNum) {
        		minNum = cnt;
        		ret = i;
        	}
        }
        return ret;
    }
};


你可能感兴趣的:(Leetcode刷题)