给你一个 m x n 的二进制网格 grid ,其中 1 表示某个朋友的家所处的位置。返回 最小的 总行走距离 。
总行走距离 是朋友们家到碰头地点的距离之和。
我们将使用 曼哈顿距离 来计算,其中 distance(p1, p2) = |p2.x - p1.x| + |p2.y - p1.y| 。
示例 1:
输入: grid = [[1,0,0,0,1],[0,0,0,0,0],[0,0,1,0,0]]
输出: 6
解释: 给定的三个人分别住在(0,0),(0,4) 和 (2,2):
(0,2) 是一个最佳的碰面点,其总行走距离为 2 + 2 + 2 = 6,最小,因此返回 6。
示例 2:
输入: grid = [[1,1]]
输出: 1
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 200
grid[i][j] == 0 or 1.
grid 中 至少 有两个朋友
解题思路:
节点的最小距离 一定是中位数。奇数情况:比如三个数 那么所有的数到中间的位置就是最小的。偶数也一样。只要是中间两个数之间的所有位置都可以。因为是二维坐标。行纵距离可以分开计算。把二维抽象成两个一维坐标进行计算。两个都是最小就是答案。
代码如下:
class Solution {
public:
//节点的最小距离 一定是中位数。奇数情况:比如三个数 那么所有的数到中间的位置就是最小的。偶数也一样。只要是中间两个数之间的所有位置都可以。因为是二维坐标。行纵距离可以分开计算。把二维抽象成两个一维坐标进行计算。两个都是最小就是答案。
int minTotalDistance(vector<vector<int>>& grid) {
vector<int>cols;
vector<int>rows;
int m = grid.size(), n = grid[0].size();
for (int i = 0; i < m; ++i)
for (int j = 0; j < n; ++j) {
if (grid[i][j] == 1) cols.emplace_back(i);
}
for(int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j) {
if (grid[j][i] == 1) rows.emplace_back(i);
}
auto getmin = [&](vector<int>& v) {
int mid = v.size() / 2;
int mvalue = v[mid];
int res = 0;
for (auto item : v) {
res += abs(item - mvalue);
}
return res;
};
return getmin(cols) + getmin(rows);
}
};