## 296. Best Meeting Point

A group of two or more people wants to meet and minimize the total travel distance. You are given a 2D grid of values 0 or 1, where each 1 marks the home of someone in the group. The distance is calculated using Manhattan Distance, where distance(p1, p2) = `|p2.x - p1.x| + |p2.y - p1.y|`.

Example:

```Input:

1 - 0 - 0 - 0 - 1
|   |   |   |   |
0 - 0 - 0 - 0 - 0
|   |   |   |   |
0 - 0 - 1 - 0 - 0

Output: 6

Explanation: Given three people living at `(0,0)`, `(0,4)`, and `(2,2)`:
The point `(0,2)` is an ideal meeting point, as the total travel distance
of 2+2+2=6 is minimal. So return 6.```

## Rust Solution

``````struct Solution;

impl Solution {
fn min_total_distance(grid: Vec<Vec<i32>>) -> i32 {
let n = grid.len();
let m = grid.len();
let mut rows = vec![];
let mut cols = vec![];
for i in 0..n {
for j in 0..m {
if grid[i][j] == 1 {
rows.push(i as i32);
}
}
}
for j in 0..m {
for i in 0..n {
if grid[i][j] == 1 {
cols.push(j as i32);
}
}
}
let r = Self::median(&rows);
let c = Self::median(&cols);
Self::distance(&rows, r) + Self::distance(&cols, c)
}

fn median(values: &[i32]) -> i32 {
let n = values.len();
values[n / 2]
}

fn distance(values: &[i32], center: i32) -> i32 {
values.iter().map(|&v| (v - center).abs()).sum()
}
}

#[test]
fn test() {
let grid = vec_vec_i32![[1, 0, 0, 0, 1], [0, 0, 0, 0, 0], [0, 0, 1, 0, 0]];
let res = 6;
assert_eq!(Solution::min_total_distance(grid), res);
}
``````

Having problems with this solution? Click here to submit an issue on github.