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[0].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.